一个新的 scala-play 项目 (v2.5.6) 从像这样的测试示例开始:
"HomeController" should {
"render the index page" in {
val home = route(app, FakeRequest(GET, "/")).get
status(home) mustBe OK
}
}
和这样的 Controller 示例,使用 Guice 注入(inject) Database
:
class DataManagementController @Inject()(db: Database) extends Controller {...}
我想像上面那样测试这个新 Controller ,但注入(inject)一个测试内存数据库而不是“默认”。经过几个小时的尝试,我无法做到这一点。我在中找到了线索
(和外部 posts 使用 FakeApplication
,尽管它们非常复杂,我更愿意遵循官方的当前版本的文档。)
据我所知,route(app, ...)
中使用了一个隐式应用
参数,因此我尝试覆盖它:
尝试 1: (编译但仍然使用数据库“默认”)
class MySpec extends PlaySpec with OneAppPerSuite {
implicit override lazy val app = new GuiceApplicationBuilder()
.configure(inMemoryDatabase("test").build()
"DataManagementController" should { ... }
尝试 2: (不编译:“无法解析符号‘TestDb’”)
class MySpec extends PlaySpec with OneAppPerSuite {
val TestDb = Databases.inMemory(name="test")
implicit override lazy val app = new GuiceApplicationBuilder()
.overrides(bind[Database].to[TestDb]).build()
"DataManagementController" should { ... }
我走在正确的轨道上吗?
最佳答案
应该不是问题,但您可以尝试:
implicit override lazy val app = new GuiceApplicationBuilder()
.overrides(bind(classOf[Database]).to(classOf[TestDb]).build()
代替
implicit override lazy val app = new GuiceApplicationBuilder()
.overrides(bind[Database].to[TestDb]).build()
和/或
"" should {
"" in new App(appBuilder) {
}
}
其中 appappBuilder
是 GuiceApplicationBuilder
关于斯卡拉玩 : How to inject test Database into Controller for testing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39489368/