如何在测试中从JsResult获取ValidationError

时间:2015-05-18 11:01:24

标签: scala playframework play-json

我有这个代码检查列表是否为空,如果它是空的,它将有ValidationError("不应该为空")

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?

非常感谢提前

1 个答案:

答案 0 :(得分:0)

不幸的是,我不认为你能够使消息检查更加冗长 - 这是一个非常复杂的结构,你必须导航。

考虑到这一点,我的建议实际上是走另一条路,并将这一大量的解除引用分解为一些可以更容易遵循的步骤。

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