2012年10月1日月曜日

Playframework2.0 + mongo(salat) でのUnitTestに関するメモ

conf/application.confに書かれた設定値は

FakeApplication(additionalConfiguration = Map("key名" -> "値"))

で置き換えられます
ですので、mongoを使っている場合

FakeApplication(additionalConfiguration = Map("mongodb.default.db" -> "dummy_db_name"))

とかで"mongodb.default.db"を書き変えてテストを実行することで、テスト用のDBが使えます



事の経緯






ということで開催されました、第一回詳しい人が誰もいないScala勉強会@Hangout




こんなかんじで みやびさん まで巻き込まれた結果がこれ。





documentにも
「このフェイクアプリケーションに対して追加の設定値を渡す (または上書きする) したり、プラグインをモックすることも可能です。例えば、 default という名前の インメモリデータベースに接続された FakeApplication を起動する場合は、次のように書きます」

FakeApplication(additionalConfiguration = inMemoryDatabase())

とありますが、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を使っても、「mongodb.default.db」を書き換えられるわけないってことでした
残念!

なお、database cleaner 的なものがパッと調べた感じでは見つからなかったので、
上記ではbeforeでテスト用のDBごとdropしてます

参考にしたのはこちら

上記のような方法でとりあえずは気兼ねなくテストケースが書けそうで何よりです。
ただ、毎度毎度書くのは面倒なので、「Specification」を拡張してどっかに置いておくとかのほうがいいと思います。




「いやそもそもこういう便利な方法あるしwww m9。゚(゚^Д^゚)゚。プギャーッハハハハヒャヒャヒャヒャ」

的なツッコミありましたら、教えてください♥





参考
http://playdocja.appspot.com/documentation/2.0.3/ScalaTest
http://modalsoul.github.com/Programing/2012/07/31/Getting-Started-with-Play2-Scala-and-Squeryl/
https://github.com/mongodb/casbah/blob/master/casbah-core/src/test/scala/ConversionsSpec.scala
https://github.com/leon/play-salat
http://stackoverflow.com/questions/10760131/using-specs2-and-fakeapplication-to-test-database-fails-evolution-inserts


サンプルとひな形を兼ねて、githubに上げています
g8 daneko/play-salat
で作成した後、play test で動くはずです。



今後も 詳しい人が誰もいないScala勉強会@Hangout をテキトーに開くと思いますw

0 件のコメント:

コメントを投稿