Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Autorerun未通过rspec测试_Ruby_Rspec - Fatal编程技术网

Ruby Autorerun未通过rspec测试

Ruby Autorerun未通过rspec测试,ruby,rspec,Ruby,Rspec,我的测试中有一些代码,这些代码与一些外部服务一起工作。这项服务不是很稳定,所以有时它会无缘无故地崩溃。但在80%的运行中,它运行良好 因此,我需要一种方法自动重新运行所有失败的RSpec几次(例如2次或3次)。 有什么办法可以做到吗?您不能重新运行失败的规范,而只是运行访问服务的方法一组次数,然后运行对结果的逻辑OR的期望值吗 因此,不是: it "returns expected value for some args" do unstable_external_service(<

我的测试中有一些代码,这些代码与一些外部服务一起工作。这项服务不是很稳定,所以有时它会无缘无故地崩溃。但在80%的运行中,它运行良好

因此,我需要一种方法自动重新运行所有失败的RSpec几次(例如2次或3次)。
有什么办法可以做到吗?

您不能重新运行失败的规范,而只是运行访问服务的方法一组次数,然后运行对结果的逻辑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()也是一个不错的方法,我认为这将是我的备份计划。它记录对外部服务的第一次呼叫,并将其保存到“磁带”中。下次运行测试时,它将直接使用磁带盒而不是外部服务。