Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为我的Scala Play2 CRUD应用程序设置内存测试数据库?_Scala_Unit Testing_Playframework 2.0_Slick_Specs2 - Fatal编程技术网

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

如何为我的Scala Play2 CRUD应用程序设置内存测试数据库?,scala,unit-testing,playframework-2.0,slick,specs2,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.

我将继续探索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) 创建此数据库并应用演进? 也许:

当我需要使用db时,使用var并始终进行“匹配/案例”并不方便。我想这是一个更好的方法

2) 在每个测试周围填充和刷新? 我是否应该创造一种特质,就像以前和将来一样

3) 是否从数据库中创建这些play.api.db.slick.DatabaseConfigProvider的副本? 有没有显示如何执行此操作的链接

我发现很少有例子可以通过运行一个伪造的应用程序来说明这一点,但是我假设有一种方法可以在运行的应用程序之外以某种方式将db传递给这样的存储库对象

谢谢你的帮助。
干杯

您可以使用
lazy val
AfterAll
进行数据库设置/拆卸,然后对每个示例使用
beforeatereach

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
}

非常感谢@Eric,这对我的第一个问题很有帮助。然而,我仍然被另外两个问题困扰着。实际上,即使我尝试使用FakeApplication工具,我仍然不知道如何填充测试数据库并将其传递到我的存储库进行测试。这就是
before
方法的目的。此方法将在每次测试之前调用,因此您可以使用它填充数据库。然后它是可访问的,因为它是所有规范都可见的
惰性val
。但是,您需要在规范中使用
sequential
参数,以确保每个测试与另一个测试保持隔离。是的,我在上一条消息中不清楚。在这里,我确实理解在这之前、之后和之后的角色。句柄“数据库”允许直接访问内存中的数据库,我也应该能够在那里应用这些改进。我最大的问题是试图将此数据库传递到存储库进行测试。在生产中,DatabaseConfigProvider将自动注入。我如何替换/覆盖/绕过这个机制来提供内存中的db进行测试?看起来我完全偏离了这个方法的轨道。Databases.inMemory似乎与使用slick作为db访问层不兼容。现在我回到0。我接着说:。我通过依赖注入配置了2个数据库(默认和测试)和DatabaseConfig,如图所示。我如何确定测试使用哪一个?也许您可以使用Guice准确地注入所需的测试数据库:
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
}