Я использую playframework 2.6 и play-slick 0.8.0.
Код действия:
def addCompany = Authenticated {
DBAction(parse.json) {
implicit rs => {
val newCompany = rs.request.body
val result = CompanyTable.insert(newCompany.as[Company])(rs.dbSession)
if(result > 0)
Ok("{\"id\":"+result+"}")
else
Ok("New company was not created.")
}
}
}
Действие представляет собой композицию действия, которое просто проверяет допустимый сеанс, и действия DBA, которое требует, чтобы тело запроса имело действительный объект JSON.
Тестовый код:
"should create a Company from a Json request" in new InMemoryDB {
val newCompany = Company(name = "New Company1")
val fr = FakeRequest(POST, "/company")
.withSession(("email", "[email protected]"))
.withHeaders(CONTENT_TYPE -> "application/json")
.withJsonBody(Json.toJson(newCompany))
val action = controllers.CompanyController.addCompany
val result = action(fr).run
status(result) should be_==(OK)
(contentAsJson(result) \ "id").as[Long] should be_>(1L)
}
Класс InMemoryDB — это просто FakeApplication с предварительно заполненной базой данных в памяти.
Проблема, с которой я сталкиваюсь, заключается в том, что при выполнении теста результатом всегда является 400 с содержимым тела, содержащим сообщение [Invalid Json]. Когда я вызываю службу с помощью curl с тем же содержимым тела JSON, она работает, и идентификатор возвращается.