假设我有一个使用自动层次查找的类:
class foo::file {
file { $foo::file_name:
owner => $foo::owner,
group => $foo::group,
ensure => $foo::ensure,
}
}
此模块的common.yaml包含以下内容的绑定:
foo::file_name: 'bar.txt'
foo::owner: 'user'
foo::group: 'user_group'
foo::ensure: 'present'
如果我想在rspec puppet中测试这一点,我如何更改实际规范文件中的hiera数据?我能找到的唯一参考资料是在hiera木偶助手中,它似乎被长期抛弃了,看起来像:
let(:hiera_data) { { 'foo::file_name' => 'nope.txt' } }
如果我想在rspec puppet中测试这一点,我如何更改实际规范文件中的层次结构数据?
您不想测试,特别是在您的规范测试中。你的注意力太狭隘了。Hiera数据与类参数的绑定是Puppet核心的函数,而不是您的类的函数,所以您不应该在测试范围内考虑它。实际上,您似乎想要测试的是类foo
的各种参数值组合,而不是被测试的类。一旦您认识到这一点,您还应该认识到,任何分配所需类参数值的方法都可以完成任务。不一定是希拉。
确实有一种可行的方法可以替代使用Hiera:您可以使用一个前置条件来提供类foo
的类似资源的声明,该声明表示所需的参数值。如果如问题所示,类foo::file
不提供声明foo
本身,那么无论如何都需要提供某种声明。示例:
let(:pre_condition) do
<<-EOS
class {'foo':
file_name => 'bar.txt',
owner => 'user',
group => 'user_group',
ensure => 'present'
}
EOS
end
在这一点上,我不应该忽略添加一点,即在清单中通常应该避免类似资源的类声明。但是,在规范测试的狭窄范围和有针对性的使用中,原因就不那么明显了。
我还注意到,前置条件方法与被测试类直接或间接执行类foo
的include-like声明的情况并不冲突,这在现实世界中很可能发生。如果被测试的类提供自己的资源(如类foo
的声明(,则会发生冲突,但在像您这样的情况下,这似乎是不可行的。
此外,请注意,模块的规范测试可以看到特定于模块的Hiera数据。您不需要手动提供。您只需要先决条件或类似的东西来测试与模块已经提供的数据不同或附加的数据。
请注意,这并不涉及类通过lookup()
函数或hiera*()
函数之一直接查找的数据。为此,您需要在测试夹具中设置真正的Hiera数据,以测试模块特定Hiera数据以外的数据。