加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 将Iteratee转换为Result

发布时间:2020-12-16 09:56:41 所属栏目:安全 来源:网络整理
导读:我正在为我的播放应用程序控制器编写测试用例,但我无法获得操作结果. val jsonresult = UserController.importOPML()( FakeRequest(POST,"/user/import-opml",FakeHeaders(),data) .withCookies(cookie) ) 只有当Action被指定为parse.multipartFormData时才
我正在为我的播放应用程序控制器编写测试用例,但我无法获得操作结果.

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 )

这次编译可以通过,但我的身份验证存根不能再通过了.造成这种奇怪错误的原因是什么?如果使用路由,为什么cookie不起作用.

解决方法

出现此问题是因为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]

请求[A]扩展了RequestHeader,因此这种情况下的A会产生重大影响.如果它与操作不匹配,您将调用错误的方法.

如果你的动作是Action [AnyContent],那么你必须传递一个Request [AnyContent] – Request [AnyContentAsJson]会工作,但是FakeRequest [JsValue]不会,因为只有前者是一个Request [AnyContent].

将ActionBuilder与BodyParser [A]一起使用时,可以创建一个Action [A].因此,您需要一个Request [A]进行测试,这意味着您问题中的数据类型至关重要.

> parse.json返回BodyParser [JsValue],因此数据必须是JsValue
> parse.multipartFormData返回BodyParser [MultipartFormData [TemporaryFile]],因此数据必须是多部分表单数据.

(注意:自从你提出这个问题以来已经有一段时间了,所以我用Play 2.3回答它,而不是你问的时候使用的2.2.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读