Как получить 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], это может сэкономить немного времени на исправление сломанного теста...

Другие вопросы по тегам