我有一个通过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
有谁知道为什么会发生这种类型的不匹配?
答案 0 :(得分:3)
我在这里发布了我从James收到的解决方案,谷歌群组,可能对其他人有用:
不幸的是,这种混淆来自Action上有两个apply方法,一个接受RequestHeader,另一个接受RequestHeader 接受请求[A],其中A必须是该主体的类型 行动接受。因此,如果您使用错误的正文传递请求 类型,它将使用RequestHeader应用方法,这是什么 返回iteratee。
所以,你的问题是你传递了错误的体型。 withJsonBody传递AnyContent的内容类型,这是得到的 在操作中未明确指定解析器时使用。但 你正在使用parse.json,这意味着正文是一个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"))
}