我正在为我们的人偶代码(人偶3.8)编写单元测试。我有一个通过hiera中的数据设置的变量。例如,我在p中有以下代码:
# globals value coming from hiera
$status = $globals['yum']['status']
if $status =~ /on/ {
service { 'yum-cron':
ensure => 'running',
enable => true,
hasrestart => true,
require => [ Package['yum-cron'], File['/var/lock/subsys/'] ]
}
} else {
service { 'yum-cron':
ensure => 'stopped',
enable => false,
hasrestart => true,
require => Package['yum-cron'],
}
file {'/var/lock/subsys/yum-cron':
ensure => 'absent',
require => Package['yum-cron'],
}
}
在我的rspec测试文件中,我具有以下代码来测试if
/ else
的两个部分:
context 'If the globals yum status = on' do
it 'The service resource yum-cron should exist' do
is_expected.to contain_service('yum-cron').with(
ensure: 'running',
enable: true,
hasrestart: true,
require: ['Package[yum-cron]', 'File[/var/lock/subsys/]' ]
)
end
end
context 'If the globals yum status = off' do
let(:status) {'off'}
it 'The service resource yum-cron should NOT exist' do
is_expected.to contain_service('yum-cron').with(
ensure: 'stopped',
enable: false,
hasrestart: true,
require: 'Package[yum-cron]'
)
end
end
无论我在xxx_setup.rb
文件中做什么以测试if
/ else
语句的两个部分,只有与匹配值匹配的部分才能成功测试。因为hiera中的值将$status
的值设置为"on"
,所以该部分在rspec测试代码中成功求值。但是,无论我如何尝试在rspec中设置状态变量的值,尝试测试$status
的值为"off"
的部分都会失败。生成人偶目录时,似乎只生成与hiera中的内容匹配的部分,而不生成我在rspec中将$status
变量设置为的部分。
我想念什么?
答案 0 :(得分:2)
let(:status)
只是设置一个局部变量status
,而不是设置全局$status
。而且,您的人偶代码会将$status
设置为全局文件顶部,因此即使您可以在rspec代码中进行设置,它也会被覆盖。
您说$globals
正在从hiera获取其价值。我以前从未使用过它,但是如果您使用的是rspec-puppet
gem,那么您可以define the path to your hiera yaml file使用它。因此,之后您可能会覆盖该值,或者每个测试都有单独的hiera yaml文件。
答案 1 :(得分:0)
非常感谢@ supremebeing7将我设置在正确的道路上。我创建了第二个hiera yaml文件,其中包含要在rspec代码中测试的替代值。我将以下代码添加到我的rspec文件中的该部分,在该部分中,我需要使用备用值进行测试:
context 'If the globals yum status = off' do
let(:hiera_config) {
'spec/fixtures/alt_hiera/hiera.yaml' }
hiera = Hiera.new({ :config =>
'spec/fixtures/alt_hiera/hiera.yaml' })
globals = hiera.lookup('globals', nil, nil)
这个替代的hiera文件为$ globals ['yum'] ['status']设置了“ off”的值,并且我的测试通过了。