Что я хочу сделать: Я пытаюсь протестировать метод действия 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, данные формы теряются.
Я только что редактировал, пожалуйста, проверьте раздел РЕДАКТИРОВАНИЕ, спасибо





Я получил ответ от Шмитча (Шмитт Кристиан).
Он ответил на мой вопрос, который я также разместил для обсуждения списка lightbend.
https://discuss.lightbend.com/t/fakerequest-withformurlencodedbody-data-is-lost/636/3
Итак, в нижней строке вместо использования метода run () используйте метод:
def call [T] (action: EssentialAction, req: Request [T]) (неявный w: Writeable [T], mat: Materializer): Future [Result] = вызов (действие, запрос, запрос. тело)
Дальнейшее объяснение описано в исходном ответе по ссылке выше.
где
addBookForm?