我想单元测试一个返回EssentialAction
的控制器方法。我将FakeRequest
传递给它,然后返回Iteratee[Array[Byte], Result]
。
看起来测试助手contentAsString
,contentType
和status
不接受此结果类型。
我缺少隐式转换吗?是否有一个示例控制器在没有调出整个FakeApplication
的情况下进行单元测试?
答案 0 :(得分:3)
基本操作是RequestHeader => Iteratee[Indata, Result]
,您可以将其应用于FakeRequest
,因为它实现了RequestHeader
。要实际执行iteratee,你可以用数据填充它,或者只是告诉它没有更多的indata。对于这两种情况,您都需要Future[Result]
返回,您需要在测试中等待。
因此,对于没有请求体的简单GET(使用play test helper await方法),你可以这样做:
val iteratee = controllers.SomeController.action()(FakeRequest())
val result: Result = await(iteratee.run)
如果你想对请求主体做请求,你将不得不做更多的事情,以便能够将请求主体提供给iteratee,并且还能正确地为你的indata编码数据。
答案 1 :(得分:1)
在Play 2.3中,PlaySpecification
包含一些辅助方法。要处理EssentialActions,您需要使用call
。由此产生的未来由其他更具体的帮助者处理。
class MySpec extends PlaySpecification {
...
val result1: Result = call(controllers.SomeController.action(), FakeRequest(...))
status(of = result1) must equalTo (OK)
...
val result2 = call(controllers.SomeController.action(), RequestHeader(...), "Body")
status(of = result2) must equalTo (BAD_REQUEST)
}