specs2 テストはデフォルトで並行して実行されるため、特に以前のテストで提供された db コンテンツに依存している場合、データベースへのアクセスで問題が発生する可能性があります。したがって、順次テストを強制するには、specs2 にそうするように指示する必要があります。
class ModelSpec extends Specification with Logging {
override def is = args(sequential = true) ^ super.is
...
}
1 つのテストで実行されるFakeApplication
場合は、テスト全体をその中にラップできます。
running(FakeApp) {
log.trace("Project tests.")
val Some(project) = Project.findByName("test1")
"Project" should {
"be retrieved by name" in {
project must beAnInstanceOf[Project]
project.description must endWith("project")
}
サンプル全体はここにあります。これは、Play で MongoDB をテストする際の問題に対処する最初の試みでした! フレームワーク。
2 番目のアプローチは、MongoDB を扱う仕様例の非常に優れたソースであるsalatプロジェクトから借りたものです (ただし、これは Play! フレームワーク アプリではありません)。Around
andを拡張する特性を定義するScope
必要があります。ここでは、アプリケーション インスタンスで初期化する必要があるものをすべて配置できます。
import org.specs2.mutable._
import org.specs2.execute.StandardResults
import play.api.mvc._
import play.api.mvc.Results
import play.api.test._
import play.api.test.Helpers._
trait FakeApp extends Around with org.specs2.specification.Scope {
val appCfg = Map(
"first.config.key" -> "a_value",
"second.config.key" -> "another value"
)
object FakeApp extends FakeApplication(
additionalPlugins = Seq("com.github.rajish.deadrope.DeadropePlugin"),
additionalConfiguration = appCfg
) {
// override val routes = Some(Routes)
}
def around[T <% org.specs2.execute.Result](test: => T) = running(FakeApp) {
Logger.debug("Running test ==================================")
test // run tests inside a fake application
}
}
2013-06-30 を編集:
署名の現在のバージョンではspecs2
、次のようにする必要があります。around
def around[T : AsResult](test: => T): Result
編集終了
次に、テストは次のように記述できます。
class SomeSpec extends Specification { sequential // according to @Eric comment
"A test group" should {
"pass some tests" in new FakeApp {
1 must_== 1
}
"and these sub-tests too" in {
"first subtest" in new FakeApp {
success
}
"second subtest" in new FakeApp {
failure
}
}
}
}
このようなスイートの完全なサンプルは、ここにあります。
最後に、スイートを開始する前にテスト データベースをクリーンアップすることもお勧めします。
step {
MongoConnection().dropDatabase("test_db")
}