Playframework FakeRequest withFormUrlEncodedBody 数据丢失

Playframework FakeRequest withFormUrlEncodedBody data is lost

我想做什么:我尝试使用 FakeRequest 测试操作方法 addbook,如下所示。

 val request = FakeRequest()
    .withSession("email" -> "admin@admin.co.jp", "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 定义为至少有两个字段("name"、"price")是必需的

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 测试它时,表单数据丢失了

我从schmitch(Schmitt Christian)那里得到了答案。

他回答了我的问题,我也发布了讨论 lightbend 列表。

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

所以最重要的是不要使用 运行() 方法,而是使用方法 :

def call[T](action: EssentialAction, req: Request[T])(implicit w: Writeable[T], mat: Materializer): Future[Result] = 调用(操作,请求,req.body)

进一步的解释在上面link中的原始答案中进行了描述。