Действие контроллера возвращает недопустимый 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.")
   }
 }
}

Действие представляет собой композицию действия, которое просто проверяет допустимый сеанс, и действия 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, она работает, и идентификатор возвращается.


person eeb    schedule 17.12.2014    source источник
comment
Переключил его на .withBody(Json.toJson(newCompany).toString()), и все равно не удалось с той же проблемой.   -  person eeb    schedule 17.12.2014


Ответы (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", "[email protected]"))
      .withHeaders(CONTENT_TYPE -> "application/json")
      .withJsonBody(Json.toJson(newCompany))
  ).get


  status(action) should be_==(OK)
  (contentAsJson(action) \ "id").as[Long] should be_>(1L)

}

Как вы можете видеть, он использует вызов для маршрутизации вместо вызова контроллера.

person eeb    schedule 19.12.2014