Ruby Autorerun未通过rspec测试
我的测试中有一些代码,这些代码与一些外部服务一起工作。这项服务不是很稳定,所以有时它会无缘无故地崩溃。但在80%的运行中,它运行良好 因此,我需要一种方法自动重新运行所有失败的RSpec几次(例如2次或3次)。Ruby Autorerun未通过rspec测试,ruby,rspec,Ruby,Rspec,我的测试中有一些代码,这些代码与一些外部服务一起工作。这项服务不是很稳定,所以有时它会无缘无故地崩溃。但在80%的运行中,它运行良好 因此,我需要一种方法自动重新运行所有失败的RSpec几次(例如2次或3次)。 有什么办法可以做到吗?您不能重新运行失败的规范,而只是运行访问服务的方法一组次数,然后运行对结果的逻辑OR的期望值吗 因此,不是: it "returns expected value for some args" do unstable_external_service(<
有什么办法可以做到吗?您不能重新运行失败的规范,而只是运行访问服务的方法一组次数,然后运行对结果的逻辑OR的期望值吗 因此,不是:
it "returns expected value for some args" do
unstable_external_service(<some args>).should == <expected return value>
end
it“返回某些参数的预期值”do
不稳定的外部服务()。应==
结束
就这样做吧:
def run_x_times(times, args)
return nil if times == 0
unstable_external_service(args) || run_x_times(times-1)
end
it "returns expected value for some args" do
run_x_times(10, <some args>).should == <expected return value>
end
def运行×次(次,参数)
如果时间=0,则返回nil
不稳定的外部服务(args)| |运行x|u次(次-1)
结束
它“返回某些参数的预期值”do
运行x_次(10,)。应==
结束
无论何时访问服务,您都可以在整个测试中使用相同的包装方法。在这里,我假设您的服务在出现故障时返回
nil
,但如果不是,您可以根据您的具体情况进行更改——您得到了一般的想法。许多人会说,您的测试实际上不应该影响外部服务,这是这样做的原因之一。您的测试不应该因为某些外部服务关闭而失败
TL;DR使用mock和stub或替换那些外部服务调用问题是外部服务不能返回任何值,这将是正确的结果(例如“邮件中没有新消息”),因此我不知道外部服务的使用可能被标记为“正确”的情况,那么您期望测试什么?不管那个值是什么,只要检查几次,如果它匹配一次,然后在期望中使用该值。谢谢,如果没有简单的方法重新运行失败的specsVCR()也是一个不错的方法,我认为这将是我的备份计划。它记录对外部服务的第一次呼叫,并将其保存到“磁带”中。下次运行测试时,它将直接使用磁带盒而不是外部服务。