Play 2.1:单元测试EssentialActions

时间:2013-07-23 02:39:53

标签: unit-testing playframework-2.1 specs2

我想单元测试一个返回EssentialAction的控制器方法。我将FakeRequest传递给它,然后返回Iteratee[Array[Byte], Result]

看起来测试助手contentAsStringcontentTypestatus不接受此结果类型。

我缺少隐式转换吗?是否有一个示例控制器在没有调出整个FakeApplication的情况下进行单元测试?

2 个答案:

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