Scalaの play-frameworkでテストを実行するときにplay-evolutionsを適用する方法は?
- playframeworkのv2.6.6を使用して
テストは次のようになります。
class TestFooController extends PlaySpec with GuiceOneServerPerSuite {
"foo endpoint should store some data" in {
val wsClient = app.injector.instanceOf[WSClient]
val url = s"http://localhost:$port/foo"
val requestData = Json.obj("foo" -> "bar")
val response = await(wsClient.url(url).post(requestData))
response.status mustBe OK
}
}
データベースconfiguratio
slick.dbs.default.driver="slick.driver.H2Driver$"
slick.dbs.default.db.driver="org.h2.Driver"
slick.dbs.default.db.url="jdbc:h2:mem:play"
Asumeテーブルfoos
を作成し、このスクリプトは、DEVモードでは正常に動作している進化のスクリプトがあります:nは次のようになります。
次のエラーがスローされたテストを実行している:
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[JdbcSQLException: Table "foos" not found;
テーブルfoos
ので、私は、データベースの進化が適用されていないことを前提と見つかりませんでした。
次に、データベース設定をdevモードで使用されるpostgresqlに変更しました。
slick.dbs.default.driver = "slick.driver.PostgresDriver$"
slick.dbs.default.db.driver = "org.postgresql.Driver"
slick.dbs.default.db.url = "jdbc:postgresql://localhost:5432/foo-test"
slick.dbs.default.db.user = "user"
slick.dbs.default.db.password = "password"
この構成では、テスト作業の細かいデータがデータベースに格納されるため、データベースの進化はうまくいきました。
問題は、テスト後にデータベースがクリーンアップされないということです。クリーンなデータベースで各テストスイートを実行したいと思います。
要約すると、 H2Dbの場合、evolutionsは適用されず、postgresqlの展開が適用されますがクリーンアップされません。
が、これは明示的にapplication.test.conf
play.evolutions.autoApply=true
play.evolutions.autoApplyDowns=true
で定義されている場合でも、私はまた
play.evolutions.db.default.autoApply=true
play.evolutions.db.default.autoApplyDowns=true
効果なし
を試してみました。そのテーブルfoos
、同じエラーが、それは影響を及ぼさないH2データベース構成について "foo endpoint should store some data" in withManagedDatabase { _ =>
...
}
:
は、それからを介して手動でこれを行うことを試みた:
def withManagedDatabase[T](block: Database => T): Unit = {
val dbapi = app.injector.instanceOf[DBApi]
val database = dbapi.database("default")
Evolutions.applyEvolutions(database)
block(database)
Evolutions.cleanupEvolutions(database)
}
した後にテストを変えます見つけることができませんがスローされます。 PostgreSQLのデータベース構成の場合は進化の例外は、私は、各テストスイートの後に実行する前に、実行中の進化アップと進化ダウンをしたい
play.api.db.evolutions.InconsistentDatabase: Database 'default' is in an inconsistent state![An evolution has not been applied properly. Please check the problem and resolve it manually before marking it as resolved.]