Как получить ValidationError из JsResult в тесте
У меня есть этот код, чтобы проверить, список пуст или нет, если он пуст, он будет иметь 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"
Код немного уродлив, есть ли лучший способ проверить ValidationError из JsResult?
Спасибо заранее
1 ответ
К сожалению, я не думаю, что вы сможете сделать проверку сообщений менее подробной - это довольно сложная структура, по которой вы должны ориентироваться.
Учитывая это, я предлагаю на самом деле пойти другим путем и разорвать эту огромную цепочку разыменований на несколько шагов, за которыми легче следовать.
Я сделал это в стиле 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]
, это может сэкономить немного времени на исправление сломанного теста...