Play Slick:如何在测试中注入 DbConfigProvider
Play Slick: How to inject DbConfigProvider in tests
我正在使用 Play 2.5.10、Play-slick 2.0.2,我的激活器生成的项目带有 scalatest 和如下代码:
class TestSpec extends PlaySpec with OneAppPerSuite {...}
我成功测试了routes/Actions;现在我会在较低级别上测试 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)
但它不会直接起作用,因为
There is no started application
和 link 到一个这样做的示例项目:
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)
但后来我得到
Type mismatch: expected a play.api.Application, got: play.Application.
至此,我失去了希望。
如何测试 DAO?
N.B。我不需要切换数据库进行测试(我通过配置处理这个),我只想在测试中访问默认数据库。
您可以使用:
lazy val appBuilder: GuiceApplicationBuilder = new GuiceApplicationBuilder().in(Mode.Test)
lazy val injector: Injector = appBuilder.injector()
lazy val dbConfProvider: DatabaseConfigProvider = injector.instanceOf[DatabaseConfigProvider]
我正在使用 Play 2.5.10、Play-slick 2.0.2,我的激活器生成的项目带有 scalatest 和如下代码:
class TestSpec extends PlaySpec with OneAppPerSuite {...}
我成功测试了routes/Actions;现在我会在较低级别上测试 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)
但它不会直接起作用,因为
There is no started application
和 link 到一个这样做的示例项目:
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)
但后来我得到
Type mismatch: expected a play.api.Application, got: play.Application.
至此,我失去了希望。
如何测试 DAO?
N.B。我不需要切换数据库进行测试(我通过配置处理这个),我只想在测试中访问默认数据库。
您可以使用:
lazy val appBuilder: GuiceApplicationBuilder = new GuiceApplicationBuilder().in(Mode.Test)
lazy val injector: Injector = appBuilder.injector()
lazy val dbConfProvider: DatabaseConfigProvider = injector.instanceOf[DatabaseConfigProvider]