rspec 失败时执行命令

rspec execute command on failure

鉴于我有一个像

这样的测试

expect(['x', 'y', 'z']).to be_empty

如何在测试失败时执行命令,例如,将失败测试的内容放入 csv 文件,其中的行名称特定于该测试中的数据。

我能想到的最好的方法是

begin
  expect(['x', 'y', 'z']).to be_empty
rescue RSpec::Expectations::ExpectationNotMetError => e
  #output to csv
  raise e
end

然而,这并不是最干净的方法。

另一种选择是将它放在 cucumber 的失败钩子上,但是我会失去指定行名的能力,或者需要事先定义行名,这也感觉很奇怪。

有没有更简洁、更精确的方法来解决这个问题?

注意:这些测试运行使用黄瓜

您可以使用 after 钩子来检查示例状态。

http://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Example#exception-instance_method

after do |example|
  if example.exception.nil?
    # passed
  else
    # failed
  end
end

我也希望能够做到这一点!所以我写了一个gem,让你定义一个on_failure处理程序来输出任何有助于调试的信息(或执行任何你想要的Ruby代码)。

使用 rspec-on_failure,您可以像这样编写示例:

on_failure ->{ output_to_csv } do
  expect(['x', 'y', 'z']).to be_empty
end

或者这个:

on_failure ->{ output_to_csv }
expect(['x', 'y', 'z']).to be_empty