你可以在rspec-puppet中覆盖参数化的类变量吗?

时间:2015-12-04 03:03:47

标签: rspec puppet rspec-puppet

我正在将单元测试改装到现有模块(不是我自己创作的)。我似乎无法将params类undef值覆盖为hash值。

params类具有以下内容(仅限摘录):

class myclass::params {
 splunk = undef,
 ...
}

主要课程(仅限摘录):

class myclass(
  $splunk = $myclass::params::splunk,
  ...
) inherits ::myclass::params
{...}

以下配置类(仅限摘录):

class mylcass::config inherits myclass{

  if  $myclass::splunk['install']['package_manage'] {
    file { "somefile.conf":
     ensure  => file,
     mode    => '0444',
     source  => 'puppet:///modules/myclass/splunk/somefile.conf',
}
   ...
  }
}

在config_spec.rb文件中,我有以下内容:

require 'spec_helper'
require 'shared_contexts'

describe 'myclass::splunk::config' do

  hiera = Hiera.new(:config => 'spec/fixtures/hiera/hiera.yaml')
  splunk = hiera.lookup('splunk',nil,nil)

  let(:params) do
    {
    }
  end

  it do
    is_expected.to contain_file('somefile.conf')
      .with(
        'ensure' => 'file',
        'mode'   => '0444',
        'source' => 'puppet:///modules/myclass/splunk/somefile.conf'
      )
  end

end

我将splunk的hiera查找插入到myclass_spec.rb文件中,希望它会覆盖:

require 'spec_helper'
require 'shared_contexts'

describe 'myclass' do

  hiera = Hiera.new(:config => 'spec/fixtures/hiera/hiera.yaml')
  splunk = hiera.lookup('splunk',nil,nil)

let(:params) do
    {
      :splunk => splunk
      ...
    }

但我继续收到以下错误:

myclass::splunk is not a hash or array when accessing it

如何覆盖splunk变量?

2 个答案:

答案 0 :(得分:0)

$::myclass::splunk是普通的类变量,而不是类参数。 Hiera不参与分配其价值。您不能在Puppet DSL中更改或覆盖其指定的值,据我所知,也不能在rspec-puppet中。

如果您最终要测试的是类参数$::myclass::params::splunk的不同值,那么您应该将 参数的值注入您的Hiera数据中。您不需要测试myclass::params的不同值,因为您可以获得该变量的不同值的唯一方法是修改类static inline void outb(unsigned short port, unsigned char value) { __asm__ __volatile__ ("outb %1, %0" : : "dN" (port), "a" (value)); } static inline unsigned char inb(unsigned short port) { unsigned char value; __asm__ __volatile__ ("inb %1, %0" : "=a"(value) : "Nd"(port)); return value; } void update_cursor(int row, int col) { unsigned short position=(row*80) + col; // cursor LOW port to vga INDEX register outb(0x3D4, 0x0F); outb(0x3D5, (unsigned char)(position&0xFF)); // cursor HIGH port to vga INDEX register outb(0x3D4, 0x0E); outb(0x3D5, (unsigned char )((position>>8)&0xFF)); } 的代码。

答案 1 :(得分:0)

一个疯狂的猜测,但很可能通过将此问题添加到describe来解决您的问题:

let(:pre_condition) { "class { 'myclass': splunk => { install => { package_manage => true } } }" }

这将导致设置myclass::splunk参数。