如何为我的Scala Play2 CRUD应用程序设置内存测试数据库?

时间:2015-12-11 12:56:46

标签: scala unit-testing playframework-2.0 slick specs2

我正在继续探索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一样吗?

3)从数据库创建这些play.api.db.slick.DatabaseConfigProvider? 任何链接显示如何执行此操作?

我发现很少有一些例子可以通过运行FakeApplication来解决这个问题,但我认为有一种方法可以将数据库以某种方式传递给正在运行的应用程序之外的此类存储库对象。?

感谢您的帮助。 干杯!

1 个答案:

答案 0 :(得分:0)

您可以使用lazy valAfterAll进行数据库设置/拆卸,然后为每个示例使用BeforeAfterEach

trait TestDB extends AfterAll with BeforeAfterEach {
  lazy val database: Database = 
    Databases.inMemory(name = "test_db")

  def afterAll = 
    database.shutdown


  def before = 
    database.populate

  def after =
    datbase.clean
}
相关问题