Playframework FakeRequest withFormUrlEncodedBody数据丢失

时间:2018-04-07 16:05:42

标签: scala unit-testing scalatest playframework-2.6

我想做什么:我尝试使用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获取Form数据时,我只得到表单约束错误。

[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对其进行测试时,表单数据将丢失

1 个答案:

答案 0 :(得分:0)

我从施密特(Schmitt Christian)那里得到了答案。

他回答了我的问题,我也发布了讨论光灯的清单。

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

所以底线不是使用run()方法,而是使用方法:

def call [T](动作:EssentialAction,req:Request [T])(隐式w:可写[T],mat:Materializer):未来[Result] =     call(action,req,req.body)

上述链接的原始答案中描述了进一步的解释。