2016-04-22 47 views
0

在斯卡拉我有一個呼叫服務控制器,這是返回我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) 
    } 
} 

回答

1

你在正確的軌道上,是的,你可以使用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

+0

我的測試被打破,因爲我得到400,而不是200.我做錯了什麼? OP用測試編輯。 –

+1

@αƞjiβ您從未設置模擬的WSResponses狀態碼,因此它默認爲0.現在,只有當狀態爲200 **時,上面的映射才映射到Ok **。在所有其他情況下(包括狀態0),它默認爲BadRequest。 – alextsc

相關問題