Ruby 如何设置全局RSpec元数据?
我有一个脚本,它将RSpec 3.4.4中的测试包装起来,并使它们在10秒后超时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
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文件和命令行为自定义选项配置此解决方案?我正在努力从文档中找出答案。这是最大的赢家!找这个花了整整一个小时。