8

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

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

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

4

1 回答 1

8

我在 RSpec 源代码中四处寻找,发现以下内容可行。只需将此代码spec_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示例组与该组中的示例数组相关联。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 的“规范”任务将失败,并且不会继续更改种子。

于 2013-09-20T18:36:13.353 回答