/ / Тест ігрової рамки. FakeRequest надсилається завжди з порожнім тілом (scala) - scala, тестування, playframework, playframework-2.0

Тест Playframework. FakeRequest відправлено з порожнім тілом завжди (scala) - scala, тестування, playframework, playframework-2.0

Я боровся кілька годин і кожного разуЯ надсилаю FakeRequest, здається, що FakeApplication отримує порожнє тіло. Однак якщо я спробую запустити програму для відтворення та надсилаю звичайний запит до localhost, все працює так, як очікувалося, я отримую текст, який я надіслав як відповідь.

введіть опис зображення тут

Ще один тест, який я зробив, - це надсилання користувальницької відповіді (не тієї, яку вона отримує) від контролера, як рядок "a".

Мій тестовий код виглядає так:

      val controller = app.injector.instanceOf(classOf[CreateRecordController])
val js = Json.obj()
val result = controller.apply().apply(
FakeRequest(POST, "/api/v1/record/")
.withHeaders(Headers(CONTENT_TYPE -> "application/json"))
.withJsonBody(js)
)

val content = contentAsJson(result)

info.apply(s"content was $content")

Останнє повідомлення друкується: "content was" та html-сторінка: "Для запиту" POST / api / v1 / record / "[Недійсний Json: Немає вмісту для відображення через кінець введення за адресою [Джерело: akka.util.ByteIterator$ByteArrayIterator$$anon$1@5fdfe8cf; рядок: 1, стовпець: 0]] "-> Отже, вміст порожній.

Мій обробник дій у контролері:

  def apply: Action[JsValue] = Action.async(parse.json) { implicit request =>

Future.successful(BadRequest(request.body).withHeaders("Content-type" -> "application/json"))

}

Чи мені щось не вистачає?

Ігрова версія: 2.6.2

Відповіді:

1 для відповіді № 1

Ось і дайте, прочитайте це спочатку - https://www.playframework.com/documentation/2.6.x/ScalaEssentialAction

Контролер

  def work = Action.async(parse.json) { implicit request =>
Future.successful(BadRequest(request.body).withHeaders((CONTENT_TYPE, "application/json")))
}

Тест

class ApplicationSpec extends PlaySpec with Results with GuiceOneAppPerTest with Injecting {
"Application" should {
"work" in {
implicit lazy val materializer: Materializer = app.materializer
val controller = new Application(inject[ControllerComponents])
val body = Json.obj()
val result = call(controller.work(), FakeRequest(POST, "/work").withHeaders((CONTENT_TYPE, "application/json")).withJsonBody(body))
contentAsJson(result) mustBe body
}
}
}

0 для відповіді № 2

Здається, що якщо вміст передається доFakeRequest під час будівництва працює так, як очікувалося. Що я бачив - це те, що якщо я передаю JsValue як тіло під час побудови, FakeRequest має тип FakeRequest [JsValue], який працює чудово. Але якщо використовується метод .withBodyAsJson, тип стає FakeRequest [AnyContentAsJson]. Це може бути помилка.