我有一个脚本包含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
中的一个选项 - 这对我来说是理想的解决方案 - 但当然它无法识别这样的自定义选项。我希望命令行能做同样的事情。
有没有办法为测试套件中的所有示例设置元数据?
答案 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
上查看
答案 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
。