无法获取rspec来测试if else puppet语句的两个部分

时间:2018-07-25 18:30:33

标签: ruby rspec puppet

我正在为我们的人偶代码(人偶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变量设置为的部分。

我想念什么?

2 个答案:

答案 0 :(得分:2)

您的rspec代码中的

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”的值,并且我的测试通过了。