1

我有这个代码来检查列表是否为空,如果它为空,它将有 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 ?

提前谢谢了

4

1 回答 1

0

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

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

我已经以 Specs2“单元”样式完成了此操作,但它很容易适应:

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]. 时,这可能会节省一些时间来修复损坏的测试......

于 2015-05-18T13:08:45.123 回答