如何设置全局RSpec元数据?

PJS*_*and 5 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
Run Code Online (Sandbox Code Playgroud)

这个脚本是在一个中心位置- ~/lib/spec_helper.rb-并require用D spec_helper在我的仓库.

我希望能够example.metadata[:timeout]在整个存储库级别进行配置,使其所有规范在两秒后超时(例如),或者(对于另一个示例)完全没有.

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

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

Myr*_*ton 5

define_derived_metadata选项正是您想要的:

\n\n
define_derived_metadata(*filters) {|metadata| ... } \xe2\x87\x92 void\n\nRSpec.configure do |config|\n # Tag all groups and examples in the spec/unit directory with\n # :type => :unit\n config.define_derived_metadata(:file_path => %r{/spec/unit/}) do |metadata|\n  metadata[:type] = :unit\n end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

在ruby​​doc.info上检查一下

\n


Dav*_*vid 3

除了对 RSpec 内部进行黑客攻击(这可能不是一个好主意)之外,实现此目的的唯一方法是滥用可用选项:

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

.rspec 配置

--format documentation
--color
--tag timeout:10
--require spec_helper
Run Code Online (Sandbox Code Playgroud)

命令行

rspec --tag timeout:2 
Run Code Online (Sandbox Code Playgroud)

您只需要小心并确保从过滤器中删除标签,否则所有测试都将被过滤掉......要使用它,在您的情况下,您只需执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

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

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