You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:33:19