4

Scalaの play-frameworkでテストを実行するときにplay-evolutionsを適用する方法は?

  • プレイスリックV3.0.2
  • プレイスリック進化のV3.0.2のため

    • 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.]

    がスローされます。これはどのように達成できますか?

  • 答えて

    0

    これは私のために働いている:

    class DAOSpec extends PlaySpec with GuiceOneAppPerSuite { 
    
        val dbUrl = sys.env.getOrElse("DATABASE_URL", "postgres://foo:[email protected]:5432/foo") 
    
        val testConfig = Map("db.default.url" -> dbUrl) 
    
        implicit override def fakeApplication() = new GuiceApplicationBuilder().configure(testConfig).build() 
    
        lazy val database = app.injector.instanceOf[Database] 
        lazy val dao = app.injector.instanceOf[DAO] 
    
        "create" must { 
        "work" in Evolutions.withEvolutions(database) { 
         val foo = await(dao.create("foo")) 
         foo.id must not be null 
        } 
        } 
    
    } 
    
    関連する問題