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中的原始答案中进行了描述。
我想做什么:我尝试使用 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中的原始答案中进行了描述。