FakeApplication不包含正文

时间:2016-11-24 15:10:05

标签: scala unit-testing playframework playframework-2.4

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

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

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

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”存在并发送了值。

Debug screen

1 个答案:

答案 0 :(得分:0)

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

<pre><span>lorem ipsum</span>
<span>&gt;&gt; lorem ipsum</span>
<span>lorem ipsum,\ </span>
<span>lorem ipsum.</span>
<span>&gt;&gt; lorem ipsum</span>
<span>lorem ipsum</span>
<span>lorem ipsum</span>
<span>lorem ipsum</span>
<span>lorem ipsum</span>
<span>lorem ipsum</span>
<span>lorem ipsum</span>
<span>lorem ipsum</span>
</pre>

现在一切正常。