7

Play 2、Salat (mongoDB バインド用) を使用して Web アプリを作成しています。レッスン モデルでいくつかのメソッドをテストしたいと思います (たとえば、id で正しいレッスンを取得するという事実をテストします)。問題は、現在の DB をダミーのレッスンで汚染したくないことです。Salat と Scala Test を使用して偽の DB を使用するにはどうすればよいですか? これが私のテストファイルの1つです。2 つのレッスンを作成し、DB に挿入し、いくつかのテストを実行します。

LessonSpec extends FlatSpec with ShouldMatchers {
  object FakeApp extends FakeApplication()

  val newLesson1 = Lesson(
    title = "lesson1",
    level = 5,
    explanations = "expl1",
    questions = Seq.empty)
  LessonDAO.insert(newLesson1)

  val newLesson2 = Lesson(
    title = "lesson2",
    level = 5,
    explanations = "expl2",
    questions = Seq.empty)
  LessonDAO.insert(newLesson2)

  "Lesson Model" should "be retrieved by level" in {
    running(FakeApp) {
      assert(Lesson.findByLevel(5).size === 2)
    }
  }
  it should "be of size 0 if no lesson of the level is found" in {
    running(FakeApp) {
      Lesson.findByLevel(4) should be(Nil)
    }
  }

  it should "be retrieved by title" in {
    running(FakeApp) {
      Lesson.findOneByTitle("lesson1") should be(Some(Lesson("lesson1", 5, "expl1", List())))
    }
  }

}

Web で検索しましたが、Salat と ScalaTest を使用する適切なリンクまたはプロジェクトが見つかりません。

4

2 に答える 2

2

ここでサラッ開発者。私の推奨は、別のテスト専用データベースを用意することです。テストデータを入力して、テストデータベースを既知の状態にすることができます(これを行う方法については、casbahテストを参照してください)。次に、必要に応じてコレクションをクリアして、好きなようにテストします。

私はscalatestではなくspecs2を使用していますが、原則は同じです。Salatテストのソースコードを参照してください。

始めるための良いテストは次のとおりです: https ://github.com/novus/salat/blob/master/salat-core/src/test/scala/com/novus/salat/test/dao/SalatDAOSpec.scala

基本仕様では、テストデータベースをクリアしていることに注意してください。これは、各仕様の前に実行されます。

trait SalatSpec extends Specification with Logging {

  override def is =
    Step {
      //      log.info("beforeSpec: registering BSON conversion helpers")
      com.mongodb.casbah.commons.conversions.scala.RegisterConversionHelpers()
      com.mongodb.casbah.commons.conversions.scala.RegisterJodaTimeConversionHelpers()

    } ^
      super.is ^
      Step {
        //        log.info("afterSpec: dropping test MongoDB '%s'".format(SalatSpecDb))
        MongoConnection().dropDatabase(SalatSpecDb)
      }

次に、SalatDAOSpecで、個々のコレクションを作成、入力、および/またはクリアするスコープ内でテストを実行して、テストを期待される状態で実行できるようにします。1つの問題:同じコレクションで同時にテストを実行すると、予期しない状態が原因でテストが失敗する可能性があります。解決策は、分離された特別な目的のコレクションでテストを実行するか、テストを強制的に直列に実行して、異なるテストケースがコレクションを変更するときに単一のコレクションでの操作が互いにステップにならないようにすることです。

Scalatestメーリングリスト(http://groups.google.com/group/scalatest-users)に投稿すると、誰かがこれを設定する正しい方法を推奨できると確信しています。

于 2012-10-15T13:34:13.937 に答える
1

私のアプリケーションでは、application.conf のパラメータを使用して Mongo データベース名を指定しています。FakeApplication を初期化するときに、そのパラメーターをオーバーライドして、単体テストで実際の Mongo インスタンスを使用できるようにしますが、本番データは表示されません。

私のアプリケーションに固有のいくつかの詳細に目を通すと、私のテストは次のようになります。

// wipe any existing data
db.collectionNames.foreach { colName =>
  if (colName != "system.indexes") db.getCollection(colName).drop
}

app = FakeApplication(additionalConfiguration = Map("mongo.db.name" -> "unit-test"))
于 2012-10-06T04:22:17.880 に答える