我有一个Scala 2.2.2应用程序,作为我的规范测试的一部分,我想插入一些夹具数据,以便进行测试,最好采用json格式。在测试中,我使用了内存中常用的H2数据库。我怎样才能做到这一点?我搜索了所有的文件,但在任何地方都没有提到这一点。
请注意,我不希望通过Global构建自己的夹具实现风格。应该有个不讨厌的方法来解决这个问题吧?
发布于 2014-05-30 21:33:15
AFAIK没有内置的东西可以做到这一点,ala Rails,很难想象如果不让Play Scala更固执己见地处理持久化(我个人认为这是负面的),开发人员能做什么。
我还使用H2来测试和使用资源文件中的普通SQL夹具,并在测试之前使用几个(相当简单的)帮助程序加载它们:
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启动时构建模式。https://stackoverflow.com/questions/23962791
复制相似问题