2016-05-02 9 views
1

私はのDAOを注入するスリック統合とGuiceのためにプレースリックを使用。テーブルを作成してシードデータを投入する進化。すなわち1.sql, 2.sql, ...。私はほぼ完了していると私は私のエボリューションファイルとapplication.conf 2に環境を分割したいです。シンプルなプレイスリックセットアップ

私はテストとライブの展開のために別のデータベースを指してconf/application.conftest/conf/application.test.confの2セットを作成しました。私は、セットアップtestためapplication.test.confを使用するbuild.sbt、

javaOptions in Test += "-Dconfig.file=test/conf/application.test.conf" 

application.test.confコンテンツ、

slick.dbs.h2test.driver = "slick.driver.H2Driver$" 
slick.dbs.h2test.db.driver = org.h2.Driver 
slick.dbs.h2test.db.url = "jdbc:test.h2:mem:play;MODE=MYSQL;DB_CLOSE_DELAY=-1" 

私はh2testコンテキストを使用するように私のテストケース/スイートを設定するにはどうすればよい(すなわち。conf/evolutions/h2test/1.sql)の代わりに、defaultを持っていますテストデータを移入し、h2test再びスリックのクエリを実行するには?私は限られた成功とFakeApplicationGuiceApplicationBuilder方法を使用しようとしました。おかげ

答えて

4

は私がapplication.test.confデフォルトを上書きするplay.slick.db.default = testを追加私のplay-slick example

class EmployeeRepositorySpec extends PlaySpecification{ 

    import models._ 

    "Employee repository" should { 

     def empRepo(implicit app: Application) = Application.instanceCache[EmployeeRepository].apply(app) 

    "get all rows" in new WithApplication() { 
     val result = await(empRepo.getAll) 
     result.length === 4 
     result.head.name === "sky" 
    } 

    "get single rows" in new WithApplication() { 
     val result = await(empRepo.getById(1)) 
    result.isDefined === true 
     result.get.name === "Vikas" 
    } 

    "insert a row" in new WithApplication() { 
    val knolId = await(empRepo.insert(Employee("sky", "[email protected]", "knoldus","Senior Consultant"))) 
    knolId === 5 
    } 

    "insert multiple rows" in new WithApplication() { 
    val result = empRepo.insertAll(List(Employee("sky1", "[email protected]", "knoldus","Senior Consultant"), 
    Employee("sky2", "[email protected]", "knoldus","Senior Consultant"))) 
     val knolIds = await(result) 
    knolIds === Seq(5, 6) 
    } 

    "update a row" in new WithApplication() { 
     val result = await(empRepo.update(Employee("sky", "[email protected]", "knoldus","Senior Consultant", Some(1)))) 
     result === 1 
    } 

    "delete a row" in new WithApplication() { 
     val result = await(empRepo.delete(1)) 
     result === 1 
    } 
    } 

    def await[T](v: Future[T]): T = Await.result(v, Duration.Inf) 

} 
+0

感謝。私はこの例を見直し、私がこれを解決した後の私の他の問題に対する解決策を見出しました。 – thlim

+0

これは既に古くなっています。実行したPlayバージョンを示すと便利です。現在、「現在の実行中のアプリケーションをコンテキストに持っていきたい場合は、依存関係注入を使用してください。」、「PlaySpecification」は存在しません。 – JulienD

+0

@Sky specs2の 'PlaySpecification'でも試しましたが、同じエラー(「あなたは暗黙的な範囲のアプリケーションを持っていません」)。私はあなたのコードをコピーして貼り付けました、私は分かりません。 – JulienD

1

を参照してください。その上で、私は、そうでない場合

play.evolutions.db.default.autoApply = false 
slick.dbs.default.driver = "slick.driver.H2Driver$" 
slick.dbs.default.db.driver = "org.h2.Driver" 
slick.dbs.default.db.url = "jdbc:h2:mem:nothing" 

を追加し、進化も「デフォルト」と私の「他のデータベース」で定義された他のデータベースが実行されていなかった移入されます、それがために失敗した接続の私のテストが失敗する原因存在しないデータベース。

0

あなたはこのようなすべてのリポジトリのための一般的なクラスの書き込みテストケースを作成することができます。

class TestModel[T: ClassTag] extends WithApplicationLoader { 
    lazy val app2dao = Application.instanceCache[T] 

    lazy val repository: T = app2dao(app) 

    def result[R](response: Future[R]): R = 
    Await.result(response, 2.seconds) 
} 

そして、今、このようなテストケースからオブジェクトを作成するためにTestModelであなたのテストクラスを渡す:

class TestRepositoryTest extends Specification { 

    private val modelTest = new ModelsTest[TestRepository] 

    "Test Repository" should { 

    "store a user" in { 
     val testObj = Test(0, "[email protected]", new DateTime(System.currentTimeMillis)) 

     val storeResult = 
     modelTest.result(modelTest.repository.store(testObj)) 

     storeResult must equalTo(1) 
    } 
    } 
} 
リマインダーのための