FakeApplication 不包含正文

Posted

技术标签:

【中文标题】FakeApplication 不包含正文【英文标题】:FakeApplication does not contain the body 【发布时间】:2016-11-24 15:10:04 【问题描述】:

我有一个用 Scala 编写的控制器,它使用身份验证特征。该特征有一个 isAuthenticated 方法,如下所示:

def isAuthenticated(f: => AccountDTO => Request[AnyContent] => Result) =
Security.Authenticated(username, onUnauthorized)  user =>
  Action.async 
    request => 
      Future.successful(f(user)(request))
    
  

在控制器中,我的方法使用 trait 方法在执行实际工作之前检查用户是否经过身份验证:

def createFileMetadata() = isAuthenticated  user => implicit request =>
    
    ....
    

在执行 POST 请求(来自 Postman 或 UI)时,一切都按预期工作,但是在尝试进行单元测试时我遇到了严重的问题。

单元测试如下:

val goodRequest = FakeRequest(POST, url).withJsonBody([a JsObject]).withHeaders((HeaderNames.AUTHORIZATION, "someMockToken"))

现在,如果在我的控制器中使用request.body.asJson,我会得到None。此外,如果我有 (HeaderNames.CONTENT_TYPE, "application/json"),我什至没有输入控制器方法就得到 400(错误请求)。

我也尝试使用withBody() 代替withJsonBody(),但结果相同。绝望地我什至尝试使用 Java 实现 RequestBuidler() 构建请求,但结果完全相同。

再次,在应用程序运行时发出请求,工作正常,只是单元测试有问题。使用调试我看到了一些奇怪的东西,这可能是问题所在。如下图所示,在执行单元测试时,请求中的'body'是空的,但是rh$1中的body是存在的,并且是我设置的。当 Postman 向应用程序发出请求时,“body”与发送的值一起存在。

【问题讨论】:

【参考方案1】:

解决方案(或解决方法)是使用 call() 而不是 apply():

val result = call(filesController.createFileMetadata(), goodRequest)

现在一切都按预期进行。

【讨论】:

以上是关于FakeApplication 不包含正文的主要内容,如果未能解决你的问题,请参考以下文章

为 iOS 和 Android 创建正文字体规则

您的应用似乎包含用于注册 Apple 推送通知服务的 API,但应用签名的权利不包括

如何使用 MFMailComposeViewController 在电子邮件正文中添加图像

怎样使word页码中的总页数不包括封面和目录(文章正文中包含很多节)

使用GAE python接收邮件,但是邮件正文中包含意外信息

怎样使word页码中的总页数不包括封面和目录(文章正文中包含很多节)