如何断言错误类型中的单个字段?
How does one assert a single field in error type?
假设我有这样的代码:
final case class CustomException(errorCode: Int, id: UUID) extends Throwable
val logic: ZIO[Any, Throwable, Unit] = ???
我想使用 ZIO 测试来检查特定的错误案例
val checkForTimeout = testM("Logic should time out") {
for {
result <- logic.flip
} yield assert(result, isSubtype[CustomException](???))
}
我想做的是检查 errorCode
字段的特定值。但似乎 ZIO Test 中现有的组合器只允许我检查完整的对象。
我想只检查 _.errorCode
而忽略 _.id
,这意味着 equalTo
对于这个用例来说不是一个足够好的组合器。
我该如何解决这个问题?
最简单的就是调整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))
}
您可以使用 Assertion.hasField
,它可以让您 "zoom in" 在较大结构的一部分上执行此操作。
val checkForTimeout = testM("Logic should time out") {
for {
result <- logic.flip
} yield assert(
result,
isSubtype[CustomException](hasField("errorCode", _.errorCode, equalTo(1)))
)
}
假设我有这样的代码:
final case class CustomException(errorCode: Int, id: UUID) extends Throwable
val logic: ZIO[Any, Throwable, Unit] = ???
我想使用 ZIO 测试来检查特定的错误案例
val checkForTimeout = testM("Logic should time out") {
for {
result <- logic.flip
} yield assert(result, isSubtype[CustomException](???))
}
我想做的是检查 errorCode
字段的特定值。但似乎 ZIO Test 中现有的组合器只允许我检查完整的对象。
我想只检查 _.errorCode
而忽略 _.id
,这意味着 equalTo
对于这个用例来说不是一个足够好的组合器。
我该如何解决这个问题?
最简单的就是调整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))
}
您可以使用 Assertion.hasField
,它可以让您 "zoom in" 在较大结构的一部分上执行此操作。
val checkForTimeout = testM("Logic should time out") {
for {
result <- logic.flip
} yield assert(
result,
isSubtype[CustomException](hasField("errorCode", _.errorCode, equalTo(1)))
)
}