一个新的scala-play项目(v2.5.6)从这样的测试示例开始:
"HomeController" should {
"render the index page" in {
val home = route(app, FakeRequest(GET, "/")).get
status(home) mustBe OK
}
}
和像这样的控制器示例,用Guice注入Database
:
class DataManagementController @Inject()(db: Database) extends Controller {...}
我想像上面那样测试这个新控制器,但是注入一个测试内存数据库而不是"默认"。经过几个小时的尝试,我无法做到这一点。我在
中找到了线索(以及使用FakeApplication
的外部posts,虽然它们非常复杂,我更愿意关注官方的当前版本的文档。)
据我所知,implicit app
中使用了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 { ... }
我是在正确的轨道上吗?
答案 0 :(得分:1)
不应该成为一个问题,但你可以尝试:
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