如何设置全局RSpec元数据?

时间:2016-11-23 01:26:41

标签: ruby rspec

我有一个脚本包含RSpec 3.4.4中的测试并导致它们在十秒后超时。

TIMEOUT = 10

RSpec.configure do | config |
  config.around do |example|
    timeout = Float(example.metadata[:timeout]) rescue TIMEOUT
    begin
      Timeout.timeout(timeout) { example.run }
    rescue Timeout::Error
      skip "Timed out after #{timeout} seconds"
    end
  end
end

此脚本位于中心位置 - ~/lib/spec_helper.rb - 并且require位于我的存储库中spec_helper s。

我希望能够在存储库范围级别配置example.metadata[:timeout],以便所有的规范超时(例如)之后两秒钟,或(另一个例子)根本没有。

我已尝试将其设置为.rspec中的一个选项 - 这对我来说是理想的解决方案 - 但当然它无法识别这样的自定义选项。我希望命令行能做同样的事情。

有没有办法为测试套件中的所有示例设置元数据?

2 个答案:

答案 0 :(得分:3)

define_derived_metadata选项完全符合您的要求:

define_derived_metadata(*filters) {|metadata| ... } ⇒ void

RSpec.configure do |config|
 # Tag all groups and examples in the spec/unit directory with
 # :type => :unit
 config.define_derived_metadata(:file_path => %r{/spec/unit/}) do |metadata|
  metadata[:type] = :unit
 end
end

rubydoc.info

上查看

答案 1 :(得分:1)

除了攻击RSpec内部,这可能不是一个好主意,你可以做到这一点的唯一方法是滥用可用的选项:

标签选项是一个很好的选择,因为它允许您输入键/值对。这样做的好处是它可以在.rspec文件中设置,并且可以通过命令行参数覆盖。例如,

.rspec配置

--format documentation
--color
--tag timeout:10
--require spec_helper

命令行

rspec --tag timeout:2 

您必须小心并确保从过滤器中删除标签,否则所有测试都将被过滤掉......要使用此功能,您只需执行以下操作:

RSpec.configure do | config |
  timeout = config.filter.delete(:timeout) || 10

  config.around do |example|
    begin
      Timeout.timeout(timeout) { example.run }
    rescue Timeout::Error
      skip "Timed out after #{timeout} seconds"
    end
  end
end

在此特定示例中,将timeout设置为零将禁用超时。

从最高到最低的优先顺序是command line arg> .rspec configuration> default specified in your config block