我创建了一个小型CRUD应用程序,以了解有关Scala和Play的更多信息。在CRUD模板之后,我获得了here on GitHub发布的解决方案。 我一直在努力使用Specs2为此开发有效的测试。现在我想测试控制器。它有这个签名:
class PersonController @Inject() (repo: PersonRepository, val messagesApi: MessagesApi)
(implicit ec: ExecutionContext) extends Controller with I18nSupport
要测试控制器的动作,我应该创建一个新的控制器。虽然我知道如何模拟存储库并且WithApplication特性将提供ExecutionContext,但我没有看到如何处理MessagesApi。
1)我应该创建它的实例还是从某个地方检索它并明确传递?如何?
2)我也要嘲笑它吗?如何?
感谢您的帮助。
答案 0 :(得分:0)
对于单元测试,我会选择模拟。 specs2(docs)和ScalaTest(docs)都与Mockito有一定程度的集成。
对于功能测试,我会使用WithApplication
范围(在specs2的情况下)并使用app injector创建控制器实例:
"should test using an injected controller" in new WithApplication {
val applicationController = app.injector.instanceOf[controllers.Application]
val result: Future[mvc.Result] = applicationController.index()(FakeRequest())
status(result) must equalTo(OK)
}
这样,Play注入器将创建具有所有必要依赖关系的控制器实例,包括MessageApi
。