如何在Play规范测试中插入json fixture数据?

时间:2014-05-30 20:19:57

标签: json scala testing playframework-2.0

我有一个Scala Play 2.2.2应用程序,作为规范测试的一部分,我想插入一些夹具数据,最好以json格式进行测试。对于测试,我使用通常的内存H2数据库。我怎么能做到这一点?我搜索了所有文档,但在任何地方都没有提及。

请注意,我不希望通过Global构建自己的夹具实现方式。这种权利应该有一种非黑客的方式吗?

1 个答案:

答案 0 :(得分:2)

AFAIK没有内置的东西可以做到这一点,ala Rails,很难想象开发人员可以做什么而不使Play Scala更加坚持应该处理持久性的方式(我个人认为是负。)

我还使用H2进行测试并在资源文件中使用普通的SQL fixture并在测试之前使用几个(相当简单的)帮助器加载它们:

package object helpers {

  import java.io.File
  import java.sql.CallableStatement
  import org.specs2.execute.{Result, AsResult}
  import org.specs2.mutable.Around
  import org.specs2.specification.Scope
  import play.api.db.DB
  import play.api.test.FakeApplication
  import play.api.test.Helpers._

  /**
   * Load a file containing SQL statements into the DB.
   */
  private def loadSqlResource(resource: String)(implicit app: FakeApplication) = DB.withConnection { conn =>
    val file = new File(getClass.getClassLoader.getResource(resource).toURI)
    val path = file.getAbsolutePath
    val statement: CallableStatement = conn.prepareCall(s"RUNSCRIPT FROM '$path'")
    statement.execute()
    conn.commit()
  }

  /**
   * Run a spec after loading the given resource name as SQL fixtures.
   */
  abstract class WithSqlFixtures(val resource: String, val app: FakeApplication = FakeApplication()) extends Around with Scope {
    implicit def implicitApp = app
    override def around[T: AsResult](t: => T): Result = {
      running(app) {
        loadSqlResource(resource)
        AsResult.effectively(t)
      }
    }
  }
}

然后,在您的实际规范中,您可以执行以下操作:

package models

import helpers.WithSqlFixtures
import play.api.test.PlaySpecification

class MyModelSpec extends PlaySpecification {
  "My model" should {
    "locate items correctly" in new WithSqlFixtures("model-fixtures.sql") {
      MyModel.findAll().size must beGreaterThan(0)
    }
  }
}

注意:这个specs2的东西可能会更好。

显然,如果你真的需要JSON,你必须添加额外的机制来反序列化你的模型并将它们保存在数据库中(通常在你的应用程序中,无论如何你都会做这些事情,在这种情况下,这可能是相对微不足道的。 )

您还需要:

  • conf/evolutions/default
  • 中建立数据库架构的一些进展
  • 启用了Evolution插件,可在FakeApplication启动时构建您的架构
  • 适当的H2 DB配置