Как правильно проверить Try [T] в ScalaTest? - PullRequest
0 голосов
/ 20 февраля 2020

Я проверил ответы, указанные в посте Как правильно проверить Try [T] с помощью ScalaTest?

Но если бы мне пришлось делать какие-либо утверждения после вызова функции или если мне нужно проверить утверждения в блоке for { } yield { }, то я следую приведенному ниже подходу:

  def test(a: Int, b: Int): Try[Int] = Try {
    a / b
  }

  it.should("succeed").in {
    (for {
      res <- test(0, 1)
    } yield {
      assert(res === 0)
      // assume more assertions are to be made
    }) match {
      case Success(value)     => value
      case Failure(exception) => fail(exception)
    }
  }

  it.should("fail").in {
    test(1, 0).failure.exception.getClass.mustBe(classOf[java.lang.ArithmeticException])
  }

Проблема с вышеприведенным подходом заключается в том, что в случае успеха, если какая-либо проблема возникает в модульный тест logi c, тогда он покажет ошибку, указывающую на строку case Failure(exception) => fail(exception), а не на строку, где произошла фактическая ошибка. Если контрольный пример огромен, то пользователю будет трудно найти, где именно произошла ошибка.

Так что есть лучший способ для модульного тестирования функций, которые возвращают Try[T], не перемещая утверждения вне блока for { } yield { }?

1 Ответ

2 голосов
/ 20 февраля 2020

Черта TryValues (задокументированная здесь ) разработана, чтобы помочь с этим:

class MyTestSpec extends FlatSpec with Matchers with TryValues {
  "tryTest" should "succeed" in {
    // Normal tests
    test(0, 1).isSuccess shouldBe true
    test(1, 1).isFailure shouldBe true

    // Use TryValues conversions
    test(0, 1).success.value shouldBe 0
    test(1, 1).failure.exception should have message "should be zero"
  }
}
...