2

假设我有这样的代码:

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 中现有的组合器只允许我检查完整的对象。我只想检查_.errorCodewhile ignoring _.id,这意味着equalTo对于这个用例来说不是一个足够好的组合子。

我将如何解决这个问题?

4

2 回答 2

4

您可以使用Assertion.hasField,它可以让您“放大”更大结构的一部分来执行此操作。

val checkForTimeout = testM("Logic should time out") {
  for {
    result <- logic.flip
  } yield assert(
      result,
      isSubtype[CustomException](hasField("errorCode", _.errorCode, equalTo(1)))
    )
}
于 2019-12-30T21:10:21.063 回答
2

最简单的事情是调整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))
}
于 2019-12-30T19:30:40.020 回答