我创建了一个简单的Puppet 4类和一个单元测试,如下所示(在touch metadata.json; rspec-puppet-init
中执行modules/test/
后):
# modules/test/manifests/hello_world1.pp
class test::hello_world1 {
file { "/tmp/hello_world1":
content => "Hello, world!\n"
}
}
# modules/test/spec/classes/test__hello_world1_spec.rb
require 'spec_helper'
describe 'test::hello_world1' do
it { is_expected.to compile }
it { is_expected.to contain_file('/tmp/hello_world1')\
.with_content(/^Hello, world!$/) }
end
我可以在rspec spec/classes/test__hello_world1_spec.rb
内执行modules/test/
来成功运行单元测试。
我现在想进入一个稍高级的类,它使用来自另一个模块的代码,即concat
(该模块已安装在modules/concat
中):
# modules/test/manifests/hello_world2.pp
class test::hello_world2
{
concat{ "/tmp/hello_world2":
ensure => present,
}
concat::fragment{ "/tmp/hello_world2_01":
target => "/tmp/hello_world2",
content => "Hello, world!\n",
order => '01',
}
}
# modules/test/spec/classes/test__hello_world2_spec.rb
require 'spec_helper'
describe 'test::hello_world2' do
it { is_expected.to compile }
# ...
end
当我在rspec spec/classes/test__hello_world2_spec.rb
中尝试使用modules/test
运行此单元测试时,收到包含以下内容的错误消息:
失败/错误:编译期间出现{is_expected.to compile}错误: 评估错误:评估资源语句时出错,未知 资源类型:' concat'
我怀疑根本原因是rspec
无法找到其他模块,因为它没有被告知" modulepath"。
我的问题是:我应该如何开始单元测试,特别是那些需要访问其他模块的测试?
答案 0 :(得分:3)
从PDK为您的平台安装download page。使用pdk new module
和pdk new class
或遵循Guide重新创建模块。
现在,我想到了代码中可能存在的直接问题:您的代码依赖于Puppet Forge模块,puppetlabs/concat
但您尚未提供它。 PDK模块模板已经预先配置puppetlabs_spec_helper
来为您的模块加载灯具。
要告诉puppetlabs_spec_helper
为您提供,您需要一个包含以下内容的文件.fixtures.yml
:
fixtures:
forge_modules:
stdlib: puppetlabs/stdlib
concat: puppetlabs/concat
请注意,您还需要puppetlabs/stdlib
,因为这是puppetlabs/concat
的依赖关系。
如果您想探索更多灯具的可能性,请参阅puppetlabs_spec_helper
's docs。
有了所有这些,并将您发布的代码示例和测试内容集成到PDLK提供的初始代码框架中,您的测试将在您运行时全部通过:
$ pdk test unit
请注意,我已经在博客文章中写了所有关于底层技术的文章,展示了如何从头开始设置Rspec-puppet等等(ref),它似乎仍然是最好的 - 关于这个主题的日期参考。
要了解有关rspec-puppet的更多信息,请参阅官方rspec-puppet docs site。