Как утверждать одно поле в типе ошибки?
Предположим, у меня есть такой код:
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))
}