2016-11-23 36 views
5

我有一个脚本,用于封装RSpec 3.4.4中的测试,并使它们在十秒后超时。如何设置全球RSpec元数据?

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 d由spec_helper秒。

我想两秒或(另一个例子)不是在所有后,能够在一个仓库范围级别配置example.metadata[:timeout],有所有其规格超时(例如)。

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

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

回答

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 

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

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

+0

“在这个特殊的例子设置超时为零将禁止使用超时。”实际上,正如你[最初]写的那样,将超时设置为零将停止该示例的运行。幸运的是,你所需要做的就是除去'unless'子句,因为'Timeout.timeout(0){...}'不会超时。 – PJSCopeland

+0

啊我其实不太确定...我会改变答案 – David

1

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

+0

太棒了!唯一缺少的是打开或关闭它的简单方法。 – PJSCopeland

+0

您可以扩展此解决方案,并演示如何从rspec文件和命令行配置自定义选项?我正在努力从文档中找出它。 – David