如果发生超时::错误,则自动重新运行rspec示例

如果发生超时::错误,则自动重新运行rspec示例,rspec,rspec2,rspec-rails,Rspec,Rspec2,Rspec Rails,首先,我同意模拟外部API调用在大多数情况下是正确的。然而,在这种情况下并非如此 我在一些测试中遇到了随机的Timeout::Error异常,我希望能够忽略它们并自动重新运行示例。只有在尝试10次失败后才应报告失败 应报告任何其他异常和故障 我尝试在spec/spec\u helper.rb文件中使用全局环绕(:each)钩子来实现此行为: RSpec.configure do |config| config.around(:each) do |example| attempts =

首先,我同意模拟外部API调用在大多数情况下是正确的。然而,在这种情况下并非如此

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

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

我尝试在
spec/spec\u helper.rb
文件中使用全局
环绕(:each)
钩子来实现此行为:

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
然而,当异常发生时,救援部分永远不会执行。知道为什么吗

谢谢! 多利安


另外,我使用的是rspec 2.6.0,您无法在块周围的
中拯救异常,因为它们不会传播。但是,如果必须重新运行失败的示例,则可以从
@example
中撬出当前异常,如下所示:


看起来很恶心。我们的借口是上游库中的一个bug,但如果可能的话,我通常会避免这种情况。

我们使用@Jo的答案作为访问日志异常的一种方式

在我们将RSpec升级到2.99(以期升级到3.0)之前,它对我们非常有用。实例变量@exception似乎不再出现在环绕钩子中的示例对象上

我们必须切换到before和after钩子,并像以前一样从after钩子的示例中访问异常

我们并没有尝试进行重试,但我不确定如何在RSPEC3.0中实现这一点

config.after(:each) do |example|
    exception = example.instance_variable_get('@exception')
    # ....
end