Ruby 如何设置全局RSpec元数据?

Ruby 如何设置全局RSpec元数据?,ruby,rspec,Ruby,Rspec,我有一个脚本,它将RSpec 3.4.4中的测试包装起来,并使它们在10秒后超时 TIMEOUT = 10 RSpec.configure do | config | config.around do |example| timeout = Float(example.metadata[:timeout]) rescue TIMEOUT begin Timeout.timeout(timeout) { example.run } rescue Timeo

我有一个脚本,它将RSpec 3.4.4中的测试包装起来,并使它们在10秒后超时

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\u helper.rb
-并且是我的存储库中的
require
d

我希望能够在存储库范围内的级别上配置
例如.metadata[:timeout]
,使其所有规范在两秒钟后超时(例如),或者(另一个示例)完全不超时

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


是否有一种方法可以为测试套件中的所有示例设置元数据?

除了对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

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


从最高到最低的优先级顺序是
命令行arg
.rspec配置
在配置块中指定的默认值

定义派生的元数据选项完全满足您的要求:

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

查看

“在此特定示例中,将超时设置为零将禁用超时的使用。”实际上,正如您[最初]所写,将超时设置为零将完全停止示例的运行。幸运的是,您需要做的就是删除
除非
子句,因为
Timeout.Timeout(0){…}
不会超时。啊,我实际上不确定。。。我将改变答案太好了!唯一缺少的是打开或关闭它的简单方法。您能否在此解决方案上展开,并演示如何从rspec文件和命令行为自定义选项配置此解决方案?我正在努力从文档中找出答案。这是最大的赢家!找这个花了整整一个小时。