拯救重试Ruby

拯救重试Ruby,ruby,rspec,Ruby,Rspec,在长时间的休息之后回到Ruby,我正在尝试使用Capybara/Cucumber的RSpec断言运行一个rescue重试块。我有以下几点是故意设计用来测试我的重试失败的。它似乎没有运行重试,我感到困惑: begin retries ||= 2 a = 1 a.eql? 2 # false raise rescue puts 'Retrying assertion for failed step' retries -= 1 if re

在长时间的休息之后回到Ruby,我正在尝试使用Capybara/Cucumber的RSpec断言运行一个rescue重试块。我有以下几点是故意设计用来测试我的重试失败的。它似乎没有运行重试,我感到困惑:

  begin
    retries ||= 2
    a = 1
    a.eql? 2 # false
    raise
  rescue
    puts 'Retrying assertion for failed step'
    retries -= 1
    if retries > 0
      sleep 0.5 # allows render of screen content
      retry
    end
  end

我怀疑我在这里写错了什么。是这样吗?

RSpec的工作原理是当
expect
失败时抛出
RSpec::expections::ExpectationNotMetError
。您正在通过无限的
救援捕获它,因此RSpec永远不会看到它,这使您的测试通过。永远不要使用无限制的
救援
。始终使用键入的rescue,最常用的类型是
StandardError
(而不是
Exception
!)-但要尽可能紧凑和具体

如果您打算捕获
ExpectationNotMetError
并重试两次,然后让它发生,那么您需要重新调用它(使用普通的
raise
)以便RSpec看到它,否则Ruby认为它已被处理,执行将正常继续(RSpec看不到它)。您仍然应该特别地拯救它,只是为了避免在被拯救的区块中可能发生的其他错误



*)除非您知道只有一件事会出错(甚至会出现三重检查)。

RSpec的工作原理是在
expect
失败时抛出
RSpec::expections::ExpectationNotMetError
。您正在通过无限的
救援捕获它,因此RSpec永远不会看到它,这使您的测试通过。永远不要使用无限制的
救援
。始终使用键入的rescue,最常用的类型是
StandardError
(而不是
Exception
!)-但要尽可能紧凑和具体

如果您打算捕获
ExpectationNotMetError
并重试两次,然后让它发生,那么您需要重新调用它(使用普通的
raise
)以便RSpec看到它,否则Ruby认为它已被处理,执行将正常继续(RSpec看不到它)。您仍然应该特别地拯救它,只是为了避免在被拯救的区块中可能发生的其他错误



*)除非你知道只有一件事会出错(甚至是三重检查)。

你能提供一个没有涉及rspec的例子吗?编辑,可以吗?我以为你是在问rspec测试。现在在编辑之后,我不知道你在问什么-代码正确地重试两次然后退出。编辑版本在我的机器上正确工作,Ruby 2.5.5。你能提供一个没有涉及rspec的例子吗?编辑,可以吗?我以为你在问rspec测试。现在,在编辑之后,我不知道你在问什么-代码正确地重试两次,然后退出。编辑后的版本在我的机器上正常工作,Ruby 2.5.5。