Scala Play:如何将测试数据库注入Controller进行测试

时间:2016-09-14 11:32:35

标签: scala playframework guice

一个新的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 { ... }

我是在正确的轨道上吗?

1 个答案:

答案 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) {
   }
}

其中appappBuilderGuiceApplicationBuilder