gpt4 book ai didi

scala - 将 Iteratee 转换为结果

转载 作者:行者123 更新时间:2023-12-04 18:07:34 25 4
gpt4 key购买 nike

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

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

这仅在指定 Action 时有效 parse.multipartFormData ,如果改为 parse.json

type mismatch; found : play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.SimpleResult] required: scala.concurrent.Future[play.api.mvc.SimpleResult]



我不知道为什么,所以我改成了
val Some(jsonresult ) = route( request )

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

最佳答案

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

// 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。)

    关于scala - 将 Iteratee 转换为结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23311787/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com