[英]How to get ValidationError from JsResult in the test
我有此代码来检查列表是否为空,如果为空,它将具有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?
提前谢谢了
不幸的是,我认为您无法使消息检查变得更加冗长-这是您必须导航的非常复杂的结构。
鉴于此,我的建议实际上是走另一条路,将庞大的取消引用链分解为一些更容易遵循的步骤。
我已经以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]
,这可能会节省一些时间来修复损坏的测试...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.