我有一个脚本包含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- 一个对我来说很理想的解决方案 - 但当然它不能识别这样的自定义选项.我希望命令行能做同样的事情.
有没有办法为测试套件中的所有示例设置元数据?
该define_derived_metadata选项正是您想要的:
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\nRun Code Online (Sandbox Code Playgroud)\n\n在rubydoc.info上检查一下
\n除了对 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 configuration。default specified in your config block