2014-04-26 118 views
4

我正在爲我的應用程序控制器編寫測試用例,並且無法獲取操作結果。將Iteratee轉換爲結果

val jsonresult = UserController.importOPML()( 
    FakeRequest(POST, "/user/import-opml",FakeHeaders(),data) 
    .withCookies(cookie) 
) 

時指定操作parse.multipartFormData這隻會工作,如果改爲parse.json

類型不匹配;實測值:play.api.libs.iteratee.Iteratee [數組[字節],play.api.mvc.SimpleResult]需要: scala.concurrent.Future [play.api.mvc.SimpleResult]

我不知道爲什麼,所以我改成

val Some(jsonresult) = route(request) 

這次編譯可以通過,但我的認證存根無法通過了。是什麼導致了這個奇怪的錯誤?如果與路線一起工作,爲什麼cookie不起作用。

+0

將結果放在將來的塊中 –

+0

您可以發佈更多的代碼,例如一個簡化的測試用例。順便說一句。你應該可以通過調用'contentAsString(jsonresult)'或'contentAsJson(jsonresult)'(確保你有'import play.api.test.Helpers._'來使用它們)來獲得你的東西。 – lpiepiora

回答

5

這個問題是因爲play.api.mvc.Action[A]包含這兩個申請方法:

// What you're hoping for 
def apply(request: Request[A]): Future[Result] 

// What actually gets called 
def apply(rh: RequestHeader): Iteratee[Array[Byte], Result] 

Request[A] extends RequestHeader,所以在這種情況下,A使所有的差異。如果它與動作不匹配,則會調用錯誤的方法。

如果你的行動是Action[AnyContent],那麼你必須通過Request[AnyContent] - Request[AnyContentAsJson]將工作,但FakeRequest[JsValue]不會,因爲只有前者是Request[AnyContent]

當您使用ActionBuilderBodyParser[A]時,您將創建一個Action[A]。因此,您需要使用Request[A]進行測試,這意味着您的問題中data的類型至關重要。

  • parse.json返回BodyParser[JsValue],所以data必須是JsValue
  • parse.multipartFormData返回BodyParser[MultipartFormData[TemporaryFile]],所以data必須是多部分形式的數據。

(注:這已經有一段時間,因爲你問到這個問題,所以我用播放2.3接聽它,而不是你使用的時候有人問了2.2。)

+1

我曾使用過其他一些方法。你的回答聽起來很合理我在抱怨的是API,它根本不一致。 – zinking

+1

我遇到類似的問題,我的安全操作,有沒有類似的解決方案? http://stackoverflow.com/questions/26303705/secured-trait-causing-spec2-unit-test-compilation-errors –

1

tjdett的答案詳細解釋了這個問題。

對於可能在您的實例中工作的快速解決方案,只需run iteratee結果有效內容。

val jsonresult = UserController.importOPML()( 
    FakeRequest(POST, "/user/import-opml",FakeHeaders(),data) 
    .withCookies(cookie) 
).run