首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用ScalaTest测试基于Salat的方法

如何用ScalaTest测试基于Salat的方法
EN

Stack Overflow用户
提问于 2012-09-29 03:16:46
回答 2查看 810关注 0票数 7

我正在使用Play 2,Salat (用于mongoDB绑定)编写一个web应用程序。我想在Lesson Model中测试一些方法(例如,测试我通过id检索正确课程的事实)。问题是,我不想用虚拟课程污染我当前的数据库。如何通过Salat和Scala测试使用假DB?这是我的一个测试文件。它创建了两个课程,并将其插入到DB中,然后在其上运行一些测试。

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-06 12:22:18

在我的应用程序中,我使用application.conf中的一个参数来指定Mongo数据库名称。在初始化我的FakeApplication时,我覆盖了这个参数,这样我的单元测试就可以使用一个真正的Mongo实例,但是看不到我的任何生产数据。

略过一些特定于我的应用程序的细节,我的测试看起来像这样:

代码语言:javascript
复制
// 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"))
票数 1
EN

Stack Overflow用户

发布于 2012-10-15 21:34:14

Salat开发人员在这里。我的建议是建立一个单独的仅限测试的数据库。您可以使用测试数据填充它,以将您的测试数据库置于已知状态-有关如何执行此操作,请参阅casbah测试-然后以您喜欢的方式对其进行测试,并根据需要清除集合。

我使用的是specs2,而不是scalatest,但原理是相同的-请参阅Salat测试的源代码。

这是一个很好的入门测试:https://github.com/novus/salat/blob/master/salat-core/src/test/scala/com/novus/salat/test/dao/SalatDAOSpec.scala

请注意,在我的基本规范中,我清理了我的测试数据库-这在每个规范之前运行:

代码语言:javascript
复制
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),我相信有人可以推荐正确的设置方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12646037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档