2012-11-26 159 views
2

我有一個創建方法來創建實體槽POST爲什麼測試方法失敗?

def create = Action(parse.json) { request => 
    val address = Json.fromJson[Address](request.body) 
    Ok(address.toString()) 
    } 

我想測試它想:

"A POST request on addresses create method" should "return OK " in { 
    val node = Json.toJson(Address(None, "street 2", "33", "343333", "Arad", "Romania", None))(controllers.AddressBean.addressWrites); 
    val result = AddressBean.create(FakeRequest().withJsonBody(node, Helpers.POST)) 

    status(result) should equal(OK) 
    contentType(result) should be(Some("application/json")) 
    } 

但覺得奇怪,我這個警告有關status(result)

類型不匹配;發現: play.api.libs.iteratee.Iteratee [陣列(字節),play.api.mvc.Result] 要求:play.api.mvc.Result

有誰知道爲什麼這種類型不匹配情況?

回答

3

我在這裏發佈我從詹姆斯收到的解決方案,在谷歌羣體,也許將是對他人有用:

可惜這混亂來自那裏就是兩個施工方法上動作,一個接受RequestHeader ,並且 接受請求[A],其中A必須是 動作接受的主體的類型。因此,如果您傳遞的請求類型錯誤 ,它將使用RequestHeader apply方法,這是 返回的迭代器。

所以,你的問題是你傳遞了錯誤的身體類型。 withJsonBody傳遞AnyContent的內容類型,這是您在操作中沒有明確指定分析器時所使用的內容類型 。但是 你正在使用parse.json,這意味着body是一個JsonNode。所以,儘量 是這樣的:

new FakeRequest(Helpers.POST, "/", FakeHeaders(), node) 

所以最後我POST試驗方法(使用scalatest)看起來像:

"A POST request on addresses create method" should "return OK " in { 
    val node = Json.toJson(Address(Some(12), "street 2", "33", "343333", "Arad", "Romania", None))(controllers.AddressBean.addressWrites); 
    val result = AddressBean.create(new FakeRequest(Helpers.POST, "/", FakeHeaders(), node)) 

    status(result) should equal(OK) 
    contentType(result) should be(Some("application/json")) 
    } 
+2

那麼什麼是withJsonBody點? –