2016-11-24 75 views
0

我有一個用Scala編寫的控制器,它使用了一個身份驗證特徵。性狀有像下面的isAuthenticated方法:FakeApplication不包含正文

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存在並且與我設置的一樣。當從郵遞員向申請人發出請求時,「身體」與發送的值一起存在。

Debug screen

回答

0

解決方案(或解決方法)是使用()調用,而不是適用():

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

現在一切按預期工作。