Play Slick:如何在测试中注入DbConfigProvider

时间:2017-02-03 09:33:13

标签: scala playframework playframework-2.0 slick

我正在使用Play 2.5.10,Play-slick 2.0.2,我的激活器生成的项目附带了scalatest和这样的代码:

class TestSpec extends PlaySpec with OneAppPerSuite {...}

我设法测试路线/行动;现在我会在较低级别上测试DAO方法。我在网上搜索了SO以寻找解决方案,并且找不到任何仍然是最新的。 DAO签名是这样的:

class TestDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile]

所以我需要传递dbConfigProvider这个东西。 出于某种原因,我不能像在控制器中那样将提供者注入测试中(没有错误,测试只是赢了):

class TestSpec @Inject()(dbConfigProvider: DatabaseConfigProvider) extends PlaySpec with OneAppPerSuite {...}

Play-Slick docs我们可以选择使用全局查找

val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)

但它不会直接工作,因为

  

没有启动申请

并链接到执行该操作的示例项目:

class TestDAOSpec extends Specification {
  "TestDAO" should {
    "work as expected" in new WithApplicationLoader {   // implicit 'app'
      val app2dao = Application.instanceCache[TestDAO].apply(app)

但我永远找不到WithApplicationLoader。相反,似乎有一个WithApplication

class TestDAOSpec extends Specification {
  "TestDAO" should {
    "work as expected" in new WithApplication() {   // implicit 'app'
      val app2dao = Application.instanceCache[TestDAO].apply(app)

然后我得到了

  

类型不匹配:预期播放.api.Application,得到:play.Application。

此时我失去了希望。

如何测试DAO?

N.B。我不需要切换数据库进行测试(我通过配置来处理),我只想在测试中访问默认数据库。

1 个答案:

答案 0 :(得分:2)

您可以使用:

lazy val appBuilder: GuiceApplicationBuilder = new GuiceApplicationBuilder().in(Mode.Test) 
lazy val injector: Injector = appBuilder.injector()
lazy val dbConfProvider: DatabaseConfigProvider = injector.instanceOf[DatabaseConfigProvider]