如何用Rspec-Puppet测试Puppet类/定义类型中资源的require元参数?
Puppet类中带
require元参数的资源如何编写spec测试? 当我拥有一个Puppet类,其中声明了带有require元参数的资源时,如何在spec测试中测试该资源及其元参数?
类中资源声明摘录
$patch = 'jboss-eap-7.4.11-patch.zip' wildfly::patch::offline { 'Atualiza JBoss para 7.4.11': source => "/tmp/${patch}", require => Class['wildfly'], }
我尝试了以下测试代码,但均失败:
首次测试尝试
let(:pre_condition) { ['define wildfly::patch::offline($source) {}'] } it do is_expected.to contain_wildfly__patch__offline('Atualiza JBoss para 7.4.11').with( 'source' => '/tmp/jboss-eap-7.4.11-patch.zip', 'require' => 'Class["wildfly"]' ) end
错误信息
expected that the catalogue would contain Wildfly::Patch::Offline[Atualiza JBoss para 7.4.11] with require set to "Class[\"wildfly\"]" but it is set to Class[Wildfly]{:name=>"Wildfly"} # ./spec/classes/jboss_74_spec.rb:23:in `block (2 levels) in <top (required)>'
根据错误信息修正的测试尝试
命名有点奇怪,但我相信错误信息
is_expected.to contain_wildfly__patch__offline('Atualiza JBoss para 7.4.11').with( 'source' => '/tmp/jboss-eap-7.4.11-patch.zip', 'require' => 'Class[Wildfly]{:name=>"Wildfly"}' )
新错误信息
expected that the catalogue would contain Wildfly::Patch::Offline[Atualiza JBoss para 7.4.11] with require set to "Class[Wildfly]{:name=>\"Wildfly\"}" but it is set to Class[Wildfly]{:name=>"Wildfly"} # ./spec/classes/jboss_74_spec.rb:23:in `block (2 levels) in <top (required)>'
问题求助
我尝试了不同的单/双引号组合,但都出现了不同的引号相关错误。请问该如何解决这个问题?
解决方案
在Puppet的RSpec测试中,require这类元参数对应的是资源引用对象,而非字符串,所以不能用字符串去匹配。有两种正确的验证方式:
方式一:直接引用资源对象
修改测试代码,将require的取值改为Class['wildfly'](注意这是资源引用,不是字符串):
let(:pre_condition) { ['define wildfly::patch::offline($source) {}'] } it do is_expected.to contain_wildfly__patch__offline('Atualiza JBoss para 7.4.11').with( 'source' => '/tmp/jboss-eap-7.4.11-patch.zip', 'require' => Class['wildfly'] ) end
方式二:使用that_requires方法验证依赖关系
RSpec-Puppet提供了更直观的方法来验证资源间的依赖,无需手动构造资源引用:
let(:pre_condition) { ['define wildfly::patch::offline($source) {}'] } it do is_expected.to contain_wildfly__patch__offline('Atualiza JBoss para 7.4.11') .with('source' => '/tmp/jboss-eap-7.4.11-patch.zip') .that_requires('Class[wildfly]') end
原理说明
之前的错误根源在于:实际的require元参数存储的是Puppet内部的资源对象(如Class[Wildfly]{:name=>"Wildfly"}),而测试中用字符串去匹配,类型不匹配导致验证失败。使用上述两种方式,要么直接匹配资源对象,要么用专用方法验证依赖关系,就能正确通过测试。
内容的提问来源于stack exchange,提问作者Emerson Prado
相关产品推荐
相关产品推荐

