Ruby 如何检查RSpec测试套件中的故障?

Ruby 如何检查RSpec测试套件中的故障?,ruby,rspec,Ruby,Rspec,我正在试验RSpec,并考虑一个只有在测试套件通过时才会改变随机种子的系统。我试图在(:suite)块之后的中实现这一点,该块在RSpec::Core::ExampleGroup对象的上下文中执行 虽然RSpec::Core::Example有一个方法“exception”,允许您检查是否有任何测试失败,但在RSpec::Core::ExampleGroup或示例列表的任何访问器上似乎没有类似的方法。那么,如何检查测试是否通过 我知道这是可能的,可以使用一个定制的格式化程序来跟踪是否有任何测试失

我正在试验RSpec,并考虑一个只有在测试套件通过时才会改变随机种子的系统。我试图在(:suite)块之后的
中实现这一点,该块在
RSpec::Core::ExampleGroup
对象的上下文中执行

虽然
RSpec::Core::Example
有一个方法“exception”,允许您检查是否有任何测试失败,但在
RSpec::Core::ExampleGroup
或示例列表的任何访问器上似乎没有类似的方法。那么,如何检查测试是否通过


我知道这是可能的,可以使用一个定制的格式化程序来跟踪是否有任何测试失败,但是格式化过程影响测试的实际运行似乎不是一个好主意。

我翻了翻RSpec源代码,发现下面的方法可行。只需将此代码放入
spec\u helper.rb
或运行测试时加载的其他文件中:

RSpec.configure do |config|
  config.after(:suite) do
    examples = RSpec.world.filtered_examples.values.flatten
    if examples.none?(&:exception)
      # change the seed here
    end
  end
end
RSpec.world.filtered_examples
hash将示例组与该组中的示例数组相关联。Rspec具有过滤某些示例的功能,并且该哈希似乎只包含实际运行的示例


设置系统的另一种方法是检查rspec进程的返回代码。如果为0,则所有测试都通过,您可以更改种子

在shell脚本中,您可以定义一个命令来更改种子并运行:

rspec && change_seed
如果您的项目有一个Rakefile,您可以设置如下内容:

task "default" => "spec_and_change_seed"

task "spec" do
  sh "rspec spec/my_spec.rb"
end

task "spec_and_change_seed" => "spec" do
  # insert code here to change the file that stores the seed
end
如果规范失败,那么rake的“规范”任务将失败,并且不会继续更改种子