如果发生Timeout :: Error,则自动重新运行rspec示例

Dor*_*ian 4 rspec rspec2 rspec-rails

首先,我同意模仿外部API调用是大多数时候做的正确的事情.但不是在这种情况下.

Timeout::Error在一些测试中得到随机异常,我希望能够忽略它们并自动重新运行该示例.只有在10次尝试失败后才应报告失败.

应报告任何其他异常和故障.

我试图使用文件中的全局around(:each)钩子来实现此行为spec/spec_helper.rb:

RSpec.configure do |config|
  config.around(:each) do |example|
    attempts = 0
    passed = false

    begin
      attempts +=1
      example.run
      passed = true

    rescue Timeout::Error => e
      raise e if attempts >= 10

    end until passed
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,当发生异常时,救援部分永远不会被执行.知道为什么吗?

谢谢!多利安

PS我正在使用rspec 2.6.0

Jo *_*iss 7

您无法在around块中挽救异常,因为它们不会传播.但是,如果您必须重新运行失败的示例,则可以删除当前的异常@example,如下所示:

https://github.com/jnicklas/capybara/blob/c21d5eb2375b610ac13f54cf240e59c80918a2f1/spec/spec_helper.rb#L16

它看起来很讨厌.我们的借口是我们上游图书馆的一个错误,但如果可能的话,我通常会避免这种情况.