我有一个看起来像
的课程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并且所有参数都已正确设置?
答案 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
。