Как утверждать одно поле в типе ошибки?

Предположим, у меня есть такой код:

final case class CustomException(errorCode: Int, id: UUID) extends Throwable

val logic: ZIO[Any, Throwable, Unit] = ???

Я хочу использовать ZIO Test для проверки конкретного случая ошибки

val checkForTimeout = testM("Logic should time out") {
  for {
    result <- logic.flip
  } yield assert(result, isSubtype[CustomException](???))
}

Я бы хотел проверить errorCodeполе для определенного значения. Но похоже, что существующие комбинаторы в ZIO Test позволяют мне проверять только весь объект. Я хочу только проверить_.errorCode игнорируя _.id, что значит equalTo не является достаточно хорошим комбинатором для этого варианта использования.

Как мне решить эту проблему?

2 ответа

Решение

Ты можешь использовать Assertion.hasField, который позволяет вам "увеличить" одну часть более крупной конструкции для этого.

val checkForTimeout = testM("Logic should time out") {
  for {
    result <- logic.flip
  } yield assert(
      result,
      isSubtype[CustomException](hasField("errorCode", _.errorCode, equalTo(1)))
    )
}

Проще всего настроить подпись logic.

val logic: ZIO[Any, CustomException, Unit] = ???

Теперь вы можете сделать что-то вроде:

val checkForTimeout = testM("Logic should time out") {
    for {
      result: CustomException <- logic.flip
    } yield assert(result.errorCode, equalTo(543))
}

Если нет, вы все равно можете применить результат:

val checkForTimeout = testM("Logic should time out") {
    for {
      th <- logic.flip
      result = th.asInstanceOf[CustomException]
    } yield assert(result.errorCode, equalTo(543))
}
Другие вопросы по тегам