2012年2月22日水曜日

Play 2.0-RC2 のSpecs2によるテストで、InMemoryDatabaseを参照する方法について

Play2.0での開発において、DBはサーバ上のOracleやMySQLなどに接続しているけれど、Modelのテストなどはサーバのデータに影響を与えたくないのでIn Memory Databaseに接続したい、という要望があるかと思います。

今日、それについて少し調べていたので、メモがてらまとめます。

Play2.0でテストを実装する場合、標準でSpecs2を使うかと思いますが、その場合にIn Memory Databaseに接続する際は、下記の記述をします。


import org.specs2.mutable._

class TestSample extends Specification {
      "connect InMemoryDatabase" in {
          running(FakeApplication(additionalConfiguration = inMemoryDatabase())) {
               1 must beEqualTo(1)
         }
      }
}
ここでのポイントは
additionalConfiguration = inMemoryDatabase()
です。

additionalConfigurationは、application.configから読み取った値を上書きしたり追記したりします。

ここで、Play2.0のinMemoryDatabaseの実装を見てみましょう。


 def inMemoryDatabase(name: String = "default"): Map[String, String] = {
     Map(
         ("db." + name + ".driver") -> "org.h2.Driver",
         ("db." + name + ".url") -> 
             ("jdbc:h2:mem:play-test-" + scala.util.Random.nextInt)
     )
 }
このように引数なしでinMemoryDatabaseを呼ぶことで、additionalConfigurationに対して"db.default.driver"と"db.default.url"の値をMapとして渡す形になり、テスト時のDBの参照先がIn Memory Databaseになるというわけです。

0 件のコメント:

コメントを投稿