【问题标题】:How does one assert a single field in error type?如何断言错误类型中的单个字段?
【发布时间】:2020-04-19 10:47:40
【问题描述】:

假设我有这样的代码:

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 对于这个用例来说不是一个足够好的组合器。

我将如何解决这个问题?

【问题讨论】:

    标签: scala zio zio-test


    【解决方案1】:

    您可以使用Assertion.hasField 来“放大”较大结构的一部分。

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

    【讨论】:

      【解决方案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))
      }
      

      【讨论】:

      • 这确实可行。但我无法更改logic 的签名,并且想避免演员表。亚当涉及hasField 的答案是我希望找到的。
      猜你喜欢
      • 2016-10-03
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-04
      • 2022-07-23
      • 2018-02-20
      • 2021-01-24
      相关资源
      最近更新 更多