Тестирование Right [Seq [MyClass]] и свойств - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь реализовать тест с ScalaTest (WordSpecLike, MustMatchers), который проверяет, содержит ли Either[Seq[Error], Seq[Value]] одно значение и имеет ли оно какие-либо определенные атрибуты.

В идеале я хотел быиметь что-то вроде:

val result:Either[Seq[Error], Seq[Value]] = ...
result.value must contain { _ have (
  'prop ("value")
)}

Но это не компилируется, и я понятия не имею, как добиться такого соответствия.

Есть ли документация по глубоким тестам или некоторые рекомендации длячто?

1 Ответ

3 голосов
/ 12 июня 2019

Inspectors позволяет делать утверждения о коллекциях и в сочетании с EitherValues, как это предлагается @ LuisMiguelMejíaSuárez, и проверка произвольных свойств с помощью have, возможен следующий синтаксис

atLeast(1, result.right.value) must have ('prop ("value"))

Вот рабочий пример

class Value(val foo: String, val bar: Int) {
  def isTooLong: Boolean = foo.length > 2
}

class StackOverflowSpec extends WordSpec with MustMatchers with EitherValues with Inspectors {
  "Result" when {
    "Right" should {
      "have property" in {
        val result: Either[Seq[Error], Seq[Value]] = Right(Seq(new Value("aa", 11), new Value("bbb", 42)))
        atLeast(1, result.right.value) must have ('tooLong (true), 'bar (42) )
      }
    }
  }
}

В качестве альтернативы попробуйте сопоставить шаблон с результатом и передать предикат свойства в Seq.exists примерно так

class Value(val foo: String, val bar: String) {
  def isTooLong: Boolean = foo.length > 2
}

class StackOverflowSpec extends WordSpec with MustMatchers {
  "Result" when {
    "Right" should {
      "have property" in {
        val result: Either[Seq[Error], Seq[Value]] = Right(Seq(new Value("a", "b"), new Value("ccc", "ddd")))
        result match {
          case Left(seq) => fail
          case Right(seq) => seq.exists(_.isTooLong) must be(true)
        }
      }
    }
  }
}
...