我有这个代码检查列表是否为空,如果它是空的,它将有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?
非常感谢提前
答案 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]
,这可能会节省一些修复破损测试的时间......