【发布时间】:2016-03-17 09:36:50
【问题描述】:
我将继续探索 Play 框架及其相关组件。我一开始就使用 CRUD 应用程序的模板连接到 PostgreSQL 数据库。它将应用程序拆分为模型、存储库、控制器和视图。这很好用。 现在,我正在尝试使用 Specs2 为这个应用程序创建一些测试。更准确地说,我正在尝试测试存储库。定义如下:
package dal
import javax.inject.{ Inject, Singleton }
import play.api.db.slick.DatabaseConfigProvider
import slick.driver.JdbcProfile
import models.Cat
import scala.concurrent.{ Future, ExecutionContext }
@Singleton
class CatRepository @Inject() (dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext) {
...
}
我想设置一个内存数据库,它将在所有测试之前创建(模式、演变),在所有测试之后销毁,填充(数据,可能使用直接 SQL)并在每个测试周围刷新。我想将它传递给我的存储库实例,然后我将使用它来执行我的测试。喜欢:
val repo = new CatRepository(inMem_DB)
那么我该怎么做: 1)创建这个数据库并应用进化? 也许:
trait TestDB extends BeforeAfterAll {
var database: Option[Database] = None
def before = {
database = Some(Databases.inMemory(name = "test_db"))
database match {
case Some(con) => Evolutions.applyEvolutions(con)
case _ => None
}
println("DB READY")
}
def after = {
database match {
case Some(con) => con.shutdown()
case _ => None
}
}
}
当我需要使用 db 时,使用 var 并始终进行“匹配/大小写”并不方便。我想有更好的方法来做到这一点......
2) 在每个测试周围填充和刷新? 我应该像 BeforeAfterAll 一样创建一个扩展 Around 的特征吗?
3) 从数据库中创建这些 play.api.db.slick.DatabaseConfigProvider ? 任何链接显示如何做到这一点?
我发现很少有例子可以通过运行 FakeApplication 来解决这个问题,但我认为有一种方法可以以某种方式将 db 传递给正在运行的应用程序之外的此类存储库对象..?
感谢您的帮助。 干杯!
【问题讨论】:
标签: scala unit-testing playframework-2.0 slick specs2