从rspec-puppet
1.0.1切换到rspec-puppet
2.0.1时,数百个测试开始失败。其中大多数都包含错误undefined method resource for #<Proc
例如:
1) haproxy on supported platforms for linux operating systems on Debian family operatingsystems Base concat fragment contents should contain global and defaults sections
Failure/Error: let(:contents) { param_value(subject, 'concat::fragment', 'haproxy-haproxy-base', 'content').split("\n") }
NoMethodError:
undefined method `resource' for #<Proc:0x0000000308a590>
# /home/travis/.rvm/gems/ruby-2.1.5/gems/puppetlabs_spec_helper-0.10.2/lib/puppetlabs_spec_helper/module_spec_helper.rb:6:in `param_value'
# ./spec/classes/haproxy_spec.rb:89:in `block (7 levels) in <top (required)>'
# ./spec/classes/haproxy_spec.rb:92:in `block (7 levels) in <top (required)>'
如何修复这些测试?
答案 0 :(得分:1)
旧测试引用变量subject
,但在rspec-puppet
2.0.1中,此更改为catalogue
。这种不兼容的变化导致主要版本颠簸。请参阅this commit.
然而,升级旧测试的正确方法并不明显。我们无法简单地进行全局搜索和替换,将subject
更改为catalogue
。
对我有用的策略是找到问题的第一个实例并修复它。这将消除该错误以及随后的许多错误。一遍又一遍地重复这个过程最终解决了所有问题。
在上面的示例中,错误中提到的第一个文件是spec/classes/haproxy_spec.rb:89
(第89行)。这显示为:
let(:contents) { param_value(subject, 'concat::fragment', 'haproxy-haproxy-base', 'content').split("\n") }
改变&#34;主题&#34;到&#34;目录&#34;像这样:
let(:contents) { param_value(catalogue, 'concat::fragment', 'haproxy-haproxy-base', 'content').split("\n") }
此更改消除了接下来的7个错误。
您还会看到以下几行:
verify_contents(subject, '/etc/default/haproxy', ['ENABLED=1'])
或
expect { subject }.to raise_error Puppet::Error, /Invalid IP address/
其中每一个都修复了有问题的错误以及该背景下的所有其他错误。
优化:您不必在每次更改后重新运行规范。您会注意到每次更改都会修复一系列错误。在上面的例子中,7个错误的序列都表示spec/classes/haproxy_spec.rb:89
。寻找提到其他行号或完全不同的文件的第一个错误,通常会发现另一行提到subject
。在这种情况下,下一个示例是spec/classes/haproxy_spec.rb:157
可能存在其他不兼容性,但这解决了我的主要问题。