Я боровся кілька годин і кожного разуЯ надсилаю 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]. Це може бути помилка.