繁体   English   中英

如何在测试中从JsResult获取ValidationError

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM