【发布时间】:2018-04-07 16:05:41
【问题描述】:
我想做的事:我尝试使用 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 定义了至少两个必填字段(“名称”、“价格”)
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测试时,表单数据丢失了
【问题讨论】:
-
addBookForm在哪里? -
我刚刚编辑,请查看编辑部分,谢谢
标签: scala unit-testing scalatest playframework-2.6