播放Slick:如何在测试中注入DbConfigProvider

Jul*_*enD 5 scala playframework playframework-2.0 slick

我正在使用Play 2.5.10,Play-slick 2.0.2,而我的激活程序生成的项目附带了scalatest和如下代码:

class TestSpec extends PlaySpec with OneAppPerSuite {...}
Run Code Online (Sandbox Code Playgroud)

我设法测试路线/动作;现在我将在较低级别上测试DAO方法。我在网络和SO上搜索了解决方案,但找不到任何最新的解决方案。DAO签名如下:

class TestDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile]
Run Code Online (Sandbox Code Playgroud)

所以我需要把dbConfigProvider东西通过 由于某种原因,我无法像在控制器中一样将提供程序注入测试中(没有错误,测试将不会运行):

class TestSpec @Inject()(dbConfigProvider: DatabaseConfigProvider) extends PlaySpec with OneAppPerSuite {...}
Run Code Online (Sandbox Code Playgroud)

播放油滑的文档说,我们可以选择使用一个全局查找

val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
Run Code Online (Sandbox Code Playgroud)

但它不会直接起作用,因为

没有启动的应用程序

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

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

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

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

但后来我明白了

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

在这一点上,我失去了希望。

如何测试DAO?

注意:我不需要切换数据库进行测试(我通过config处理),我只想访问测试中的默认数据库。

Sim*_*mon 3

您可以使用:

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