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