rspec-puppet如何测试一个定义为类的成员

时间:2017-06-24 10:09:13

标签: rspec puppet rspec-puppet

我有一个看起来像

的课程
class addon {
    case $::operatingsystem {
    'windows': {
        Dsc_xfirewall {
            dsc_ensure    => 'Present',
        }
     }
     'RedHat': {
     }
     default: { warning "OS : ${::operatingsystem} is not (yet) supported" }
  }
}

我希望我的测试看起来像

describe 'addon', :type => :class do
    os = 'windows'
    let(:facts) {{:operatingsystem => os}}
    describe os do
        it {
            is_expected.to contain_class('addon').with(
              {
                :Dsc_xfirewall => {
                  :dsc_ensure => 'Present',
                }
              }
            )
        }
    end
end

目录正确编译,为清楚起见,删除了is_expected.to编译。但是我似乎无法让这个工作:dsc_xfirewall是零,如果我尝试Dsc_xfirewall同样的故事,如果尝试

contains_dsc_xfirewall

我收到dsc_firewall不是有效定义的错误。有没有人有任何想法如何更好地构建我的测试?在任何人指出如果目录正确编译我不需要这个测试之前,我知道;这只是一个更复杂的东西。

因此,我的问题是:测试必须要检查该类是否包含dsc_xfirewall并且所有参数都已正确设置?

1 个答案:

答案 0 :(得分:1)

显而易见的问题是你的清单没有声明任何实际资源,而你的Rspec似乎期望清单实际上是这样做的。

这段代码:

    Dsc_xfirewall {
        dsc_ensure => 'Present',
    }

为自定义类型dsc_xfirewall声明资源默认值ref)。我的猜测是P中的大写Present也是拼写错误。

我还注意到您的let(:facts)声明放错位置,并且您打开了另一个describe块,我认为您应该使用context

我根据我认为你要做的事情编写了一些代码,以说明清单和Rspec代码应该是什么样的:

(我更改了一些内容,以便我可以轻松地在Mac上进行编译。)

class foo {
  case $::operatingsystem {
    'Darwin': {
      file { '/tmp/foo':
        ensure => file,
      }
    }
    'RedHat': {
    }
    default: { fail("OS : ${::operatingsystem} is not (yet) supported") }
  }
}

Rspec的:

describe 'foo', :type => :class do
  context 'Darwin' do
    let(:facts) {{:operatingsystem => 'Darwin'}}
    it {
      is_expected.to contain_class('foo')
    }
    it {
      is_expected.to contain_file('/tmp/foo').with(
        {
          :ensure => 'file',
        }
      )
    }

    # Write out the catalog for debugging purposes.
    it { File.write('myclass.json', PSON.pretty_generate(catalogue)) }
  end
end

显然,您可以使用contain_file代替contain_dsc_xfirewall