【问题标题】:Playframework FakeRequest withFormUrlEncodedBody data is lostPlayframework FakeRequest withFormUrlEncodedBody 数据丢失
【发布时间】: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


【解决方案1】:

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

他回答了我的问题,我也发布了讨论 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] = 调用(动作,req,req.body)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 2016-07-05
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多