【问题标题】:Simple Play Slick Setup for Unit Testing用于单元测试的简单 Play Slick 设置
【发布时间】:2016-05-02 09:08:07
【问题描述】:

我使用 play-slick 进行 Slick 集成,使用 Guice 注入 DAO。创建表和填充种子数据的演变,即1.sql, 2.sql, ...。我几乎完成了,我想将我的 Evolutions 文件和 application.conf 拆分为 2 个环境。

我创建了 2 组 conf/application.conftest/conf/application.test.conf 指向不同的数据库进行测试和实时部署。我已经设置 build.sbt 使用application.test.conftest

javaOptions in Test += "-Dconfig.file=test/conf/application.test.conf"

application.test.conf 内容,

slick.dbs.h2test.driver = "slick.driver.H2Driver$"
slick.dbs.h2test.db.driver = org.h2.Driver
slick.dbs.h2test.db.url = "jdbc:test.h2:mem:play;MODE=MYSQL;DB_CLOSE_DELAY=-1"

如何配置我的测试用例/套件以使用h2test 上下文(即conf/evolutions/h2test/1.sql)而不是default 来填充测试数据并再次运行Slick 查询h2test?我尝试使用FakeApplicationGuiceApplicationBuilder 方式,但效果有限。谢谢

【问题讨论】:

    标签: scala unit-testing playframework slick


    【解决方案1】:

    我看到了我的play-slick example

      class EmployeeRepositorySpec extends PlaySpecification{
    
         import models._
    
         "Employee repository" should {
    
           def empRepo(implicit app: Application) = Application.instanceCache[EmployeeRepository].apply(app)
    
        "get all rows" in new WithApplication()  {
          val result = await(empRepo.getAll)
          result.length === 4
          result.head.name === "sky"
         }
    
      "get single rows" in new  WithApplication()  {
          val result = await(empRepo.getById(1))
        result.isDefined === true
          result.get.name === "Vikas"
      }
    
       "insert a row" in new  WithApplication()  {
        val knolId = await(empRepo.insert(Employee("sky", "sky@knoldus.com",  "knoldus","Senior Consultant")))
         knolId === 5
        }
    
       "insert multiple rows" in new  WithApplication()  {
         val result = empRepo.insertAll(List(Employee("sky1", "sky1@knoldus.com", "knoldus","Senior Consultant"),
        Employee("sky2", "sky2@knoldus.com", "knoldus","Senior Consultant")))
          val knolIds = await(result)
         knolIds === Seq(5, 6)
        }
    
        "update a row" in new  WithApplication()  {
          val result = await(empRepo.update(Employee("sky", "sky@knoldus.com",  "knoldus","Senior Consultant", Some(1))))
          result === 1
         }
    
         "delete a row" in new  WithApplication()  {
           val result = await(empRepo.delete(1))
           result === 1
         }
        }
    
       def await[T](v: Future[T]): T = Await.result(v, Duration.Inf)
    
     }
    

    【讨论】:

    • 感谢您的提醒。我重新查看了此示例,并找到了解决此问题后遇到的其他问题的解决方案。
    • 这已经过时了。指示它运行的 Play 版本会很有用。现在它说“您的范围内没有隐式应用程序。如果要将当前运行的应用程序带入上下文,请使用依赖注入。”,PlaySpecification 不存在。
    • @Sky 我也尝试使用 specs2 PlaySpecification,但同样的错误(“您在范围内没有隐式应用程序。”)。我复制并粘贴了您的代码,我只是不明白。
    【解决方案2】:

    我添加了play.slick.db.default = test 以覆盖application.test.conf 中的默认。最重要的是,我添加了

    play.evolutions.db.default.autoApply = false
    slick.dbs.default.driver = "slick.driver.H2Driver$"
    slick.dbs.default.db.driver = "org.h2.Driver"
    slick.dbs.default.db.url = "jdbc:h2:mem:nothing"
    

    否则,Evolution 还将填充“默认”定义的其他数据库,而我的“其他数据库”没有运行,这导致我的测试由于与不存在的数据库的连接失败而失败。

    【讨论】:

      【解决方案3】:

      您可以像这样为所有存储库创建一个通用类编写测试用例:

       class TestModel[T: ClassTag] extends WithApplicationLoader {
        lazy val app2dao = Application.instanceCache[T]
      
        lazy val repository: T = app2dao(app)
      
        def result[R](response: Future[R]): R =
          Await.result(response, 2.seconds)
      }
      

      然后,现在在 TestModel 中传递您的测试类,以从您的测试用例中创建一个对象,如下所示:

      class TestRepositoryTest extends Specification {
      
        private val modelTest = new ModelsTest[TestRepository]
      
        "Test Repository" should {
      
          "store a user" in {
            val testObj = Test(0, "test@example.com", new DateTime(System.currentTimeMillis))
      
            val storeResult =
              modelTest.result(modelTest.repository.store(testObj))
      
            storeResult must equalTo(1)
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-29
        • 2010-10-26
        • 2013-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        相关资源
        最近更新 更多