Play-ReactiveMongo 插件:play2 使用 reactiveMongoApi 测试控制器

Play-ReactiveMongo plugin: play2 testing a controller with a reactiveMongoApi

下面我使用的是0.11.0.play24版本的Play2 ReactiveMongo插件(https://github.com/ReactiveMongo/Play-ReactiveMongo) 适用于 Play 2.4。

如位于 http://reactivemongo.org/releases/0.11/documentation/tutorial/play2.html 的文档中所述,具有 Mongo 的 Play2 控制器实例化如下:

class MyController @Inject() (val reactiveMongoApi: ReactiveMongoApi)
extends Controller with MongoController with ReactiveMongoComponents { }

因此,由于控制器现在是 class 而不是对象,因此无法在测试用例中将其用作单例。

但是,我不知道如何注入反应式MongoApi 以便在测试用例(ScalaCheck 或其他...)中使用正确的参数实例化 MyController()

关于如何使用 ScalaCheck 或 Specs2 测试此类控制器,您有任何idea/example吗?

提前致谢!

您可以为 ReactiveMongoApi 生成模拟(取决于您使用的模拟框架):

val reactiveMongoApi = mock[ReactiveMongoApi]

然后你可以这样做:

new MyController(reactiveMongoApi)

这是最简单的方法。要使用实际的 ReactiveMongoApi 对象:

val app = new GuiceApplicationBuilder()
  .in(Mode.Test)
  .configure("play.modules.enabled" -> "play.modules.reactivemongo.ReactiveMongoModule")
  .build

val reactiveMongoApi = app.injector.instanceOf[ReactiveMongoApi]

如果它变得更复杂,例如,部分模拟嵌套依赖树(这是比单元测试更多的集成测试),您可能需要部分模拟 Guice 框架,如 here 所述。

该项目使用 Guice 进行依赖注入,使用 Spec2 测试控制器,使用 Frisby 测试端点。

https://github.com/luongbalinh/play-mongo