如何将 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

可能还有其他不兼容问题,但这解决了我的主要问题。