You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ZIO中使用Schedule.exponential测试重试效果时出现挂起问题求助

问题原因

使用Schedule.exponential时,重试间隔是指数增长的(默认底数为2):第一次重试等待10ms,第二次20ms,第三次40ms。你的测试仅调用了一次TestClock.adjust(10.milliseconds),只能触发第一次重试,但后续重试需要的时间未推进,导致测试挂起等待时钟前进。而单独使用Schedule.recurs时无时间间隔,无需调整时钟,因此测试正常运行。

解决方案

需要确保测试时钟推进到足够覆盖所有重试延迟的时间点,推荐使用TestClock.fastForward一次性推进足够时间,自动触发所有重试:

test("test retry exponential") {
  for {
    // 启动效果并转为后台执行
    fiber <- ZIO.fail("fail")
      .retry(
        Schedule.exponential(10.milliseconds) && 
        Schedule.recurs(3).tapOutput(o => ZIO.logInfo(s"retrying $o"))
      )
      .fork
    // 快速推进时钟,覆盖所有重试所需的总延迟(10+20+40=70ms,这里用1秒确保足够)
    _ <- TestClock.fastForward(1.second)
    // 获取最终结果,重试3次后仍为失败
    result <- fiber.join.either
  } yield assertTrue(result.isLeft)
}
额外说明

原测试中的assertTrue(res == null)逻辑错误:因为重试3次后effect依然失败,代码不会走到yield环节,测试会直接失败。改用either捕获结果,断言其为失败状态才符合预期。

内容的提问来源于stack exchange,提问作者Ivan K.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:12:14