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

私はこれを別の方法で解決することを選択しました:

私はこのようなフィクスチャを作りました:

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 に答える
1

Global.onStartは、アプリケーションの起動時に、どのモード(dev、prod、test)でも、一度だけ実行する必要があります。Globalの使用方法については、wikiに従ってください。

その方法では、DBステータスを確認してデータを入力できます。たとえば、テストでは、メモリ内データベースを使用する場合は空にする必要があるため、次のような操作を行います。

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 に答える