【问题标题】:How to get ValidationError from JsResult in the test如何在测试中从 JsResult 中获取 ValidationError
【发布时间】:2015-05-18 11:01:24
【问题描述】:

我有这个代码来检查列表是否为空,如果它为空,它将有 ValidationError("should not empty")

case class Foo(t: List[String], r: String)

object Foo {
  implicit val fooReads: Reads[Foo] = (
  (JsPath \ "t").read[List[String]]
      .filter(ValidationError("should not empty"))(_.nonEmpty) and
    (JsPath \ "r").read[String]
  )
}

但是,我不知道如何在测试中获取验证错误。

val json =  """
      |{
      |  "t": [],
      |  "r": "123"
      |}
    """.stripMargin
val result: JsResult[Foo] = json.validate[Foo]

result.isError shouldBe true
result.asEither.left.get.head._2.head.message shouldBe "should not empty"

代码有点丑,有没有更好的方法从 JsResult 测试 ValidationError ?

在此先感谢

【问题讨论】:

  • 您是否只需要在测试中出现空列表的错误?或者您是否想要在您的读取中实施某种验证规则?这意味着该规则将在列表为空的任何时候抛出,不仅在测试中。
  • 我只是想从中得到错误信息,但是语法很冗长

标签: scala playframework play-json


【解决方案1】:

不幸的是,我认为您无法让消息检查变得不那么冗长 - 这是一个您必须导航的非常复杂的结构。

鉴于此,我的建议实际上是另辟蹊径,将庞大的取消引用链分解为一些更容易遵循的步骤。

我已经在 Specs2 “Unit” 样式中完成了这个,但它很容易适应:

result.isError must beTrue

val allErrors = result.asEither.left.get
allErrors must haveSize(1)

val firstBadNode = allErrors.head
firstBadNode._1 must beEqualTo(JsPath \ "t")

val badNodeErrors = firstBadNode._2
badNodeErrors must haveSize(1)
badNodeErrors.head.message must beEqualTo("should not empty")

如果有人重构某些东西并破坏了您的Reads[Foo],这可能会节省一些时间来修复损坏的测试...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2013-07-21
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多