【问题标题】:raise an error on the xth time and after that return a value第 x 次引发错误,然后返回一个值
【发布时间】:2016-01-12 12:50:01
【问题描述】:

我想使用 rspec 来模拟 flakey 服务处理。

为此,我想让服务调用引发几次异常,然后在这些时间之后返回实际值。

rspec 可以做到这一点吗?

我试过了

allow(Service).to receive(:run).once.and_raise(MyError)
allow(Service).to receive(:run).once.and_return(response)

但在第一次运行时它返回响应而不是错误

【问题讨论】:

  • 这是一个非常酷的测试!不幸的是,我认为在 rspec 中很难做到,所以也许你可以把它分成两个测试。一是检查失败后的重试行为,二是检查有效的响应行为?
  • 我这样做了,但我想检查我使用的重试块是否确实有效,因此在捕获一些异常后,它会按应有的方式执行并返回实际值。

标签: ruby-on-rails ruby-on-rails-4 rspec


【解决方案1】:

您可以使用block implementation 来完成此操作以作为响应。

call_count = 0
allow(Service).to receive(:run) do
  call_count += 1
  call_count < 3 ? raise(MyError) : response
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-17
    • 2017-12-14
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多