如何将 rspec-puppet 测试从 1.x 转换为 2.0.1?
How to convert rspec-puppet tests from 1.x to 2.0.1?
当从 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)>'
如何修复这些测试?
旧测试引用变量 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") }
将 "subject" 更改为 "catalogue",如下所示:
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
可能还有其他不兼容问题,但这解决了我的主要问题。
当从 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)>'
如何修复这些测试?
旧测试引用变量 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") }
将 "subject" 更改为 "catalogue",如下所示:
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
可能还有其他不兼容问题,但这解决了我的主要问题。