12

各テスト ファイルの先頭で進化スクリプトを手動で実行したいと考えています。私はPlayで働いています!2.4 と Slick 3。

ドキュメントによると、行く方法は次のようです。

Evolutions.applyEvolutions(database)

しかし、データベースのインスタンスを取得できません。ドキュメント では、play.api.db.Databasesデータベース インスタンスを取得するためにインポートされますが、インポートしようとすると、次のエラーが発生します。object Databases is not a member of package play.api.db

進化スクリプトを実行するためにデータベースのインスタンスを取得するにはどうすればよいですか?

編集:コメントで尋ねられたように、ここにエラーを与えるソースコード全体があります:

import models._
import org.scalatest.concurrent.ScalaFutures._
import org.scalatest.time.{Seconds, Span}
import org.scalatestplus.play._
import play.api.db.evolutions.Evolutions
import play.api.db.Databases

class TestAddressModel extends PlaySpec with OneAppPerSuite {
   lazy val appBuilder = new GuiceApplicationBuilder()
   lazy val injector = appBuilder.injector()
   lazy val dbConfProvider = injector.instanceOf[DatabaseConfigProvider]

  def beforeAll() = {
    //val database: Database = ???
    //Evolutions.applyEvolutions(database)
  }

  "test" must { 
     "test" in { } 
  } 
}
4

5 に答える 5

11

私はついにこの解決策を見つけました。Guiceで注入します:

lazy val appBuilder = new GuiceApplicationBuilder()

lazy val injector = appBuilder.injector()

lazy val databaseApi = injector.instanceOf[DBApi] //here is the important line

(インポートする必要がありますplay.api.db.DBApi。)

そして、私のテストでは、次のことを行うだけです (実際には、テストに別のデータベースを使用しています)。

override def beforeAll() = {
  Evolutions.applyEvolutions(databaseApi.database("default"))
}

override def afterAll() = {
  Evolutions.cleanupEvolutions(databaseApi.database("default"))
}
于 2015-10-28T18:51:51.580 に答える
2

進化が別のモジュールに移動された Play 2.4 を使用していることを考えるとevolutions、プロジェクトの依存関係を追加する必要があります。

libraryDependencies += evolutions
于 2015-10-28T14:57:36.377 に答える
0

進化を適用してテストを実行する最も簡単な方法は、 を使用FakeApplicationし、DB の接続情報を手動で入力することです。

def withDB[T](code: => T): T =
  // Create application to run database evolutions
  running(FakeApplication(additionalConfiguration = Map(
    "db.default.driver"   -> "<my-driver-class>",
    "db.default.url"      -> "<my-db-url>",
    "db.default.user"     -> "<my-db>",
    "db.default.password" -> "<my-password>",
    "evolutionplugin"     -> "enabled"
    ))) {
    // Start a db session
    withSession(code)
  }

次のように使用します。

"test" in withDB { }

これにより、たとえば、メモリ内データベースを使用して単体テストを高速化できます。

play.api.db.DB必要に応じてDB インスタンスにアクセスできます。また、する必要がありますimport play.api.Play.current

于 2015-10-28T15:05:34.220 に答える
0

FakeApplication を使用して DB 構成を読み取り、DB インスタンスを提供します。

def withDB[T](code: => T): T =
  // Create application to run database evolutions
  running(FakeApplication(additionalConfiguration = Map(
       "evolutionplugin" -> "disabled"))) {
    import play.api.Play.current
    val database = play.api.db.DB
    Evolutions.applyEvolutions(database)
    withSession(code)
    Evolutions.cleanupEvolutions(database)
  }

次のように使用します。

"test" in withDB { }
于 2015-10-28T16:10:00.180 に答える