Scala тестов с лучшей практикой Either и Pattern Matching - PullRequest
0 голосов
/ 21 января 2020

Я хочу проверить мой метод, который возвращает либо. Вот как я могу это сделать:

@Test def `Test empty name is not valid`: Unit = {
    val book = createBook()
    val result = insertEntryToBook(book, "", "12345")

    result match {
      case Left(InvalidNameFormat) => true
      case _ => fail()
    }
  }

Должен ли я сделать некоторый вызов assert () вместо fail (), чтобы сделать сообщение о сбое теста более явным (например, для бокового представления утверждения)?

Ответы [ 2 ]

1 голос
/ 21 января 2020

ScalaTest можно использовать с JUnit , поэтому рассмотрите возможность смешивания в EitherValues, которое должно давать более информативные сообщения

import org.junit.Test
import org.scalatest.{EitherValues, Matchers}

class ExampleSuite extends Matchers with EitherValues {
  @Test def matchEithers(): Unit = {
    val result: Either[String, Int] = Right(42)
    result.left.value should be ("Boom")
  }
}

, что дает

org.scalatest.exceptions.TestFailedException: The Either on which left.value was invoked was not defined as a Left.

    at org.scalatest.EitherValues$LeftValuable.value(EitherValues.scala:124)
    at example.ExampleSuite.matchEithers(ExampleSuite.scala:9)
    ...
1 голос
/ 21 января 2020

Здесь нет причин для сопоставления с образцом. Вы можете просто утверждать, что результат равен ожидаемому значению, заключенному в Left().

assertEquals(Left(InvalidNameFormat), result)

. Если ваш тест не пройден, вы получите точное сообщение об ошибке.

...