我有一个Scala Play 2.2.2应用程序,作为规范测试的一部分,我想插入一些夹具数据,最好以json格式进行测试。对于测试,我使用通常的内存H2数据库。我怎么能做到这一点?我搜索了所有文档,但在任何地方都没有提及。
请注意,我不希望通过Global构建自己的夹具实现方式。这种权利应该有一种非黑客的方式吗?
答案 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
FakeApplication
启动时构建您的架构