处理未来的[WSResponse]找到成功或错误状态
问题描述:
在斯卡拉我有一个呼叫服务控制器,这是返回我Future[WSResponse]
。我想确保服务返回有效的结果,所以发送Ok(..)
否则发送BadRequest(...)
。我不认为我可以使用map
。任何其他建议?从@alextsc处理未来的[WSResponse]找到成功或错误状态
def someWork = Action.async(parse.xml) { request =>
val result:Future[WSResponse] = someService.processData(request.body.toString())
//Need to send back Ok or BadRequest Message
}
编辑 解决方案是工作的罚款。现在转移到测试我现有的测试失败。它越来越400,而不是200
test("should post something") {
val requestBody = <value>{UUID.randomUUID}</value>
val mockResponse = mock[WSResponse]
val expectedResponse: Future[WSResponse] = Future.successful(mockResponse)
val request = FakeRequest(Helpers.POST, "/posthere").withXmlBody(requestBody)
when(mockResponse.body).thenReturn("SOME_RESPONSE")
when(someService.processData(any[String])).thenReturn(expectedResponse)
val response: Future[Result] = call(controller.someWork , request)
whenReady(response) { response =>
assert(response.header.status == 200)
}
}
答
你在正确的轨道上,是的,你可以使用map
。
既然你已经使用Action.async并且因为它代表所有你需要做你的服务返回的未来是未来映射到未来[结果]所以玩可以处理它:
def someWork = Action.async(parse.xml) { request =>
someService.processData(request.body.toString()).map {
// Assuming status 200 (OK) is a valid result for you.
case resp : WSResponse if resp.getStatus == 200 => Ok(...)
case _ => BadRequest(...)
}
}
(我注意到,你的服务返回WSResponse
(从播放ws的Java库),而不是play.api.libs.ws.Response
(它的斯卡拉版本),因此getStatus
并不仅仅是status
)
我的测试被打破,因为我得到400,而不是200.我做错了什么? OP用测试编辑。 –
@αƞjiβ您从未设置模拟的WSResponses状态码,因此它默认为0.现在,只有当状态为200 **时,上面的映射才映射到Ok **。在所有其他情况下(包括状态0),它默认为BadRequest。 – alextsc