Unit testing 重头戏2.1:单元测试要素

Unit testing 重头戏2.1:单元测试要素,unit-testing,playframework-2.1,specs2,Unit Testing,Playframework 2.1,Specs2,我想单元测试一个返回EssentialAction的控制器方法。我将一个FakeRequest传递给它,然后返回一个Iteratee[Array[Byte],Result] 测试帮助程序contentAsString、contentType和status似乎不接受此结果类型 我是否缺少隐式转换?是否有这样一个例子,控制器在某个地方进行了单元测试,而没有启动整个FakeApplication?一个基本操作是RequestHeader=>Iteratee[Indata,Result],您可以将其应用

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

测试帮助程序
contentAsString
contentType
status
似乎不接受此结果类型


我是否缺少隐式转换?是否有这样一个例子,控制器在某个地方进行了单元测试,而没有启动整个
FakeApplication

一个基本操作是
RequestHeader=>Iteratee[Indata,Result]
,您可以将其应用于
FakeRequest
,因为它实现了
RequestHeader
。要实际执行iteratee,您可以用数据填充它,或者直接告诉它不再有indata。对于这两种情况,您都会得到一个
Future[Result]
,您需要在测试中等待它

因此,对于没有请求主体的简单GET(使用play test helper Wait方法),您可以这样做:

val iteratee = controllers.SomeController.action()(FakeRequest())
val result: Result = await(iteratee.run)

如果您想使用请求主体执行请求,您将需要做更多的工作,以便能够将请求主体提供给迭代对象,并且还要注意正确地编码您的indata数据。

在Play 2.3中,
PlaySpecification
包括两个助手方法。为了处理基本问题,您需要使用
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)
}

测试助手在哪里等待方法活动?我需要什么导入?play.api.test.Helpers.\uu在这里的文档中提到:或者,不是等待方法,而是导入。谢谢,这帮了大忙