如何基于Salat和ScalaTest测试方法

我正在使用Play 2,Salat(用于mongoDB bindin)编写Web应用程序。 我想在课程模型中测试一些方法(例如,测试通过id检索正确课程的事实)。 问题是我不想用虚拟课程来污染我目前的数据库。 我如何使用Salat和Scala Test来使用假数据库? 这是我的测试文件之一。 它创建了两个课程,并将其插入数据库,并对其进行一些测试。

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())))
    }
  }

}

我在网上搜索,但我找不到使用Salat和ScalaTest的好链接或项目。


在我的应用程序中,我使用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"))

Salat开发者在这里。 我的建议是建立一个单独的测试数据库。 您可以使用测试数据填充测试数据,以便将测试数据库置于已知状态 - 请参阅casbah测试以了解如何执行此操作 - 然后根据需要进行测试,根据需要清除集合。

我使用specs2,而不是scalatest,但原理是一样的 - 请参阅萨拉特测试的源代码。

这是一个很好的测试,以帮助您开始: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中,我在范围内运行测试,这些范围创建,填充和/或清除各个集合,以便测试可以以预期状态运行。 一个问题:如果您在同一个集合上同时运行测试,它们可能会因意外状态而失败。 解决方案是在单独的特殊用途集合中运行测试,或强制您的测试以串行方式运行,以便在不同的测试用例修改集合时,单个集合上的操作不会互相影响。

如果您发布到Scalatest邮件列表(http://groups.google.com/group/scalatest-users),我相信有人可以推荐正确的方式来设置它。

链接地址: http://www.djcxy.com/p/11257.html

上一篇: How to test methods based on Salat with ScalaTest

下一篇: How to add config transform for custom config file?