4

我在让我的测试在我的数据库中插入假数据时遇到了一些问题。我尝试了几种方法,但没有运气。在 FakeApplication 中运行测试时,似乎 Global.onStart 没有运行,尽管我认为我读到它应该可以工作。

object TestGlobal extends GlobalSettings {
  val config = Map("global" -> "controllers.TestGlobal")

  override def onStart(app: play.api.Application) = {
    // load the data ... 
  }
}

在我的测试代码中:

private def fakeApp = FakeApplication(additionalConfiguration = (
  inMemoryDatabase().toSeq +
  TestGlobal.config.toSeq
).toMap, additionalPlugins = Seq("plugin.InsertTestDataPlugin"))

然后我running(fakeApp)在每个测试中使用。

plugin.InsertTestDataPlugin是另一种尝试,但如果没有在其中定义插件,它就无法工作conf/play.plugins——这是不想要的,因为我只希望在测试范围内使用此代码。

这些中的任何一个都应该起作用吗?有没有人通过类似的选择成功?

4

2 回答 2

1

Global.onStart 应该在应用程序启动时执行一次(并且只执行一次),无论它处于何种模式(开发、产品、测试)。尝试按照wiki 了解如何使用 Global

在该方法中,您可以检查数据库状态并进行填充。例如在测试中,如果你使用内存数据库,它应该是空的,所以做类似的事情:

if(User.findAll.isEmpty) {  //code taken from Play 2.0 samples

      Seq(
        User("guillaume@sample.com", "Guillaume Bort", "secret"),
        User("maxime@sample.com", "Maxime Dantec", "secret"),
        User("sadek@sample.com", "Sadek Drobi", "secret"),
        User("erwan@sample.com", "Erwan Loisant", "secret")
      ).foreach(User.create)   

  }
于 2012-06-21T15:32:11.480 回答
1

我选择以另一种方式解决这个问题:

我做了一个这样的夹具:

def runWithTestDatabase[T](block: => T) {
  val fakeApp = FakeApplication(additionalConfiguration = inMemoryDatabase())

  running(fakeApp) {
    ProjectRepositoryFake.insertTestDataIfEmpty()
    block
  }
}

然后,而不是running(FakeApplication()){ /* ... */},我这样做:

class StuffTest extends FunSpec with ShouldMatchers with CommonFixtures {
  describe("Stuff") {
    it("should be found in the database") {
      runWithTestDatabase {       // <--- *The interesting part of this example*
        findStuff("bar").size must be(1);
      }
    }
  }
}
于 2012-06-22T11:16:01.517 回答