Действие контроллера возвращает "Invalid Json" при использовании Fakerequest из теста spec2
Я использую 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.")
}
}
}
Действие - это композиция действия, которая просто проверяет допустимый сеанс и действие DBAction, для которого требуется, чтобы в теле запроса был действительный объект 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", "bob@villa.com"))
.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, он работает, и возвращается идентификатор.
1 ответ
Я решил создать отдельный тестовый проект и использовал активатор для создания начального числа для нового проекта. Я заметил, что в сгенерированном тесте использовался другой метод вызова действия, поэтому я переключил свой проект на использование этого метода. Это сработало, но я не знаю почему.
Новый код:
"should create a Company from a Json request" in new InMemoryDB {
val newCompany = Company(name = "New Company1")
val action = route(
FakeRequest(POST, "/company")
.withSession(("email", "bob@villa.com"))
.withHeaders(CONTENT_TYPE -> "application/json")
.withJsonBody(Json.toJson(newCompany))
).get
status(action) should be_==(OK)
(contentAsJson(action) \ "id").as[Long] should be_>(1L)
}
Как вы можете видеть, он использует вызов для маршрутизации вместо вызова контроллера.