【问题标题】:convert Iteratee to Result将 Iteratee 转换为 Result
【发布时间】:2015-12-06 20:15:38
【问题描述】:

我正在为我的 play 应用程序控制器编写测试用例,但在获取操作结果时遇到了问题。

val jsonresult = UserController.importOPML()( 
   FakeRequest(POST, "/user/import-opml",FakeHeaders(),data)
   .withCookies(cookie) 
)

这只有在 Action 被指定为parse.multipartFormData 时才有效,如果它被更改为parse.json

类型不匹配;发现:play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.SimpleResult] 需要: scala.concurrent.Future[play.api.mvc.SimpleResult]

我不知道为什么,所以我改成

val Some(jsonresult ) = route( request )

这次编译可以通过,但我的身份验证存根不能通过了。是什么导致了那个奇怪的错误?如果使用路由,为什么 cookie 不起作用。

【问题讨论】:

  • 将结果放入未来区块
  • 您能否发布更多代码,例如一个简化的测试用例。顺便提一句。你应该能够通过调用contentAsString(jsonresult)contentAsJson(jsonresult) 来让你的东西正常工作(确保你有import play.api.test.Helpers._ 来使用它们)。

标签: scala playframework


【解决方案1】:

出现这个问题是因为play.api.mvc.Action[A]包含这两个apply方法:

// What you're hoping for
def apply(request: Request[A]): Future[Result]

// What actually gets called
def apply(rh: RequestHeader): Iteratee[Array[Byte], Result]

Request[A] extends RequestHeader,所以在这种情况下,A 会有所不同。如果它与动作不匹配,您将调用错误的方法。

如果您的操作是Action[AnyContent],那么您必须传递Request[AnyContent] - Request[AnyContentAsJson] 可以,但FakeRequest[JsValue] 不会,因为只有前者是Request[AnyContent]

当您将ActionBuilderBodyParser[A] 一起使用时,您将创建一个Action[A]。因此,您需要 Request[A] 进行测试,这意味着您问题中 data 的类型至关重要。

  • parse.json 返回 BodyParser[JsValue],所以 data 必须是 JsValue
  • parse.multipartFormData 返回一个BodyParser[MultipartFormData[TemporaryFile]],所以data 必须是多部分表单数据。

(注意:你问这个问题已经有一段时间了,所以我使用 Play 2.3 来回答这个问题,而不是你被问到时使用的 2.2。)

【讨论】:

  • 我使用其他方法解决了问题。你的回答听起来很合理。我抱怨的是 API,它根本不一致。
  • 我的安全操作遇到了类似的问题,是否有类似的解决方案? stackoverflow.com/questions/26303705/…
  • 这就是我的情况。通过案例类构造函数而不是伴随对象的 apply 函数构造 FakeRequest 为我解决了这个问题。
【解决方案2】:

tjdett 的回答详细解释了这个问题。

对于可能在您的实例中工作的快速解决方案,只需 run iteratee 结果负载即可。

val jsonresult = UserController.importOPML()( 
   FakeRequest(POST, "/user/import-opml",FakeHeaders(),data)
   .withCookies(cookie) 
).run

【讨论】:

    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多