FakeApplication(additionalConfiguration = Map("key名" -> "値"))
で置き換えられます
ですので、mongoを使っている場合
FakeApplication(additionalConfiguration = Map("mongodb.default.db" -> "dummy_db_name"))
とかで"mongodb.default.db"を書き変えてテストを実行することで、テスト用のDBが使えます
事の経緯
うむ。午後は家に帰って、scalaの勉強しよう。久しぶりにやる気が出た。
— けるけるぱっぱさん (@kerukerupappa) 9月 30, 2012
@3a3k ちょ。普通に無理wwww
— けるけるぱっぱさん (@kerukerupappa) 9月 30, 2012
@3a3k へい。なんでしょ?
— けるけるぱっぱさん (@kerukerupappa) 9月 30, 2012
ということで開催されました、第一回詳しい人が誰もいないScala勉強会@Hangout
乗った RT @3a3k: 詳しい人が誰もいないScala勉強会 @ Hangout はいいかもしれない。
— みやなんとかさんさん (@myb1126) 9月 30, 2012
こんなかんじで みやびさん まで巻き込まれた結果がこれ。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package models | |
import play.api.test._ | |
import play.api.test.Helpers._ | |
import org.specs2.mutable._ | |
import org.specs2.specification.Scope | |
import org.specs2.runner.JUnitRunner | |
import org.junit.runner.RunWith | |
import com.mongodb.casbah.MongoConnection | |
@RunWith(classOf[JUnitRunner]) | |
class TaskSpecs2 extends Specification { | |
sequential | |
"using task model" should { | |
"get all task" in context { | |
running(context.fakeApp) { | |
Task.all.size must_== 0 | |
Task.create("hoge") | |
Task.create("fuga") | |
Task.all.size must_== 2 | |
} | |
} | |
} | |
object context extends BeforeAfter { | |
lazy val dummy_db_name = "test_app_db" | |
lazy val fakeApp = FakeApplication(additionalConfiguration = Map("mongodb.default.db" -> dummy_db_name)) | |
def before = { | |
implicit val mongoDB = MongoConnection()(dummy_db_name) | |
mongoDB.dropDatabase() | |
} | |
def after = () | |
} | |
} |
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