Playframework FakeRequest с данными FormUrlEncodedBody потеряны

Что я хочу сделать: я пытаюсь протестировать метод действия addbook с помощью FakeRequest, как показано ниже.

 val request = FakeRequest()
    .withSession("email" -> "[email protected]", "name" -> "yun", "id" -> "1")
    .withFormUrlEncodedBody(
      "name" -> "Great Gatsby",
      "price" -> "30",
      "author" -> "Scott",
      "description" -> "Great classic"
    )
    .withCSRFToken

  val result = homeController.addBook(request).run()(materializer)
  flash(result).get("msg") mustBe Some("some msg")
  status(result) must equal(SEE_OTHER)
  redirectLocation(result) mustBe Some("/somelocation")

Что не так: но когда я связываю данные формы с помощью bindFromRequest, я не получаю ничего, кроме ошибок ограничения формы.

[warn] c.HomeController - data : 
[warn] c.HomeController - errors : FormError(name,List(error.required),List()), FormError(price,List(error.required),List())

addBookForm определяется как минимум двумя обязательными полями ("имя", "цена")

val addBookForm = Form(
mapping(
  "name" -> nonEmptyText,
  "price" -> longNumber,
  "author" -> optional(text),
  "description" -> optional(text),
  "pictures" -> Forms.list(text).verifying("more than 5 pictures detected", list => list.size <= 5),
  "reserved" -> optional(boolean),
  "publisher" -> optional(longNumber),
)(BookFormData.apply)(BookFormData.unapply)
)

Определение действия addbook показано ниже.

def addBook = isAuthenticatedAsync { (userId, userName, userEmail) =>
implicit request =>

  logger.warn("data : " + addBookForm.bindFromRequest.data.mkString(", "))
  logger.warn("errors : " + addBookForm.bindFromRequest.errors.mkString(", "))
  ....

И isAuthenticatedAsync

def isAuthenticatedAsync (f: => (String, String, String) => MessagesRequest[AnyContent] => Future[Result]) = Security.Authenticated(userInfo, onUnauthorized) { user =>
    Action.async(request => f(user._1,user._2,user._3)(request))
  }

Когда я меняю метод isAuthenticatedAsync только на Async, я могу получить данные формы, но я не знаю, что мне не хватает, почему это не работает.

Скажите, пожалуйста, что мне не хватает?

Хорошего дня!

ИЗМЕНИТЬ

Я включил этот код addbookForm.

Просто чтобы подчеркнуть, действие addbook работает, как и ожидалось, с реальным запросом (через браузер). Но когда я тестирую его с помощью Faketest, данные формы теряются.


person Augusto    schedule 07.04.2018    source источник
comment
где addBookForm?   -  person Arpit Suthar    schedule 08.04.2018
comment
Я только что отредактировал, пожалуйста, проверьте раздел EDIT, спасибо   -  person Augusto    schedule 09.04.2018


Ответы (1)


Я получил ответ от Шмитча (Шмитт Кристиан).

Он ответил на мой вопрос, который я также разместил для обсуждения списка магии света.

https://discuss.lightbend.com/t/fakerequest-withformurlencodedbody-data-is-lost/636/3

Итак, суть в том, что вместо использования метода run() используйте метод:

def call[T](action: EssentialAction, req: Request[T])(implicit w: Writeable[T], mat: Materializer): Future[Result] = call(action, req, req.body)

Дальнейшее объяснение описано в исходном ответе по ссылке выше.

person Augusto    schedule 17.04.2018