如何在 rspec-puppet 中添加模板文件
how to add template file in rspec-puppet
我有以下 sudo 用户清单,加载模板文件
class sudo {
if $::operatingsystemmajrelease < 7 {
$variable = $::operatingsystemmajrelease ? {
'6' => $::fqdn,
}
file { '/etc/sudoers' :
ensure => present,
owner => 'root',
group => 'root',
mode => '0440',
content => template('sudo/sudoers.erb'),
}
}
}
下面是我的rspec文件
vim test_spec.rb
require 'spec_helper'
describe 'sudo' do
it { should contain_class('sudo')}
let(:facts) {{:operatingsystemmajrelease => 6}}
if (6 < 7)
context "testing sudo template with rspec" do
let(:params) {{:content => template('sudo/sudoers.erb')}}
it {should contain_file('/etc/sudoers').with(
'ensure' => 'present',
'owner' => 'root',
'group' => 'root',
'mode' => '0440',
'content' => template('sudo/sudoers.erb'))}
end
end
end
当 运行 "rake spec"
时出现以下错误
.F
Failures:
1) sudo testing sudo template with rspec
Failure/Error: 'content' => template('sudo/sudoers.erb'))}
NoMethodError:
undefined method `template' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x7f5802e70bd8>
# ./spec/classes/test_spec.rb:17
Finished in 0.16067 seconds
2 examples, 1 failure
Failed examples:
rspec ./spec/classes/test_spec.rb:12 # sudo testing sudo template with rspec
rake aborted!
ruby -S rspec spec/classes/test_spec.rb failed
任何人都可以指导我如何使用 rspec-puppet 测试模板。我上网两天多也头破血流none有帮助
您可以选择为内容提供字符串或正则表达式:
context 'with compress => true' do
let(:params) { {:compress => true} }
it do
should contain_file('/etc/logrotate.d/nginx') \
.with_content(/^\s*compress$/)
end
end
context 'with compress => false' do
let(:params) { {:compress => false} }
it do
should contain_file('/etc/logrotate.d/nginx') \
.with_content(/^\s*nocompress$/)
end
end
这里有完整的描述:http://rspec-puppet.com/tutorial/
template
是 Puppet 解析器的一个函数,因此不适用于您的单元测试。
如果您真的想将现有模板用作固定装置,则必须manually评估其 ERB 代码。
更好的单元测试方法是在测试代码中对测试数据进行硬编码。
if (6 < 7)
context "testing sudo template with rspec" do
let(:params) {{:content => 'SPEC-CONTENT'}}
it {should contain_file('/etc/sudoers').with(
'ensure' => 'present',
'owner' => 'root',
'group' => 'root',
'mode' => '0440',
'content' => 'SPEC-CONTENT'}
end
end
在验收或集成测试领域使用实际有效的模板更有趣。
我有以下 sudo 用户清单,加载模板文件
class sudo {
if $::operatingsystemmajrelease < 7 {
$variable = $::operatingsystemmajrelease ? {
'6' => $::fqdn,
}
file { '/etc/sudoers' :
ensure => present,
owner => 'root',
group => 'root',
mode => '0440',
content => template('sudo/sudoers.erb'),
}
}
}
下面是我的rspec文件
vim test_spec.rb
require 'spec_helper'
describe 'sudo' do
it { should contain_class('sudo')}
let(:facts) {{:operatingsystemmajrelease => 6}}
if (6 < 7)
context "testing sudo template with rspec" do
let(:params) {{:content => template('sudo/sudoers.erb')}}
it {should contain_file('/etc/sudoers').with(
'ensure' => 'present',
'owner' => 'root',
'group' => 'root',
'mode' => '0440',
'content' => template('sudo/sudoers.erb'))}
end
end
end
当 运行 "rake spec"
时出现以下错误.F
Failures:
1) sudo testing sudo template with rspec
Failure/Error: 'content' => template('sudo/sudoers.erb'))}
NoMethodError:
undefined method `template' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x7f5802e70bd8>
# ./spec/classes/test_spec.rb:17
Finished in 0.16067 seconds
2 examples, 1 failure
Failed examples:
rspec ./spec/classes/test_spec.rb:12 # sudo testing sudo template with rspec
rake aborted!
ruby -S rspec spec/classes/test_spec.rb failed
任何人都可以指导我如何使用 rspec-puppet 测试模板。我上网两天多也头破血流none有帮助
您可以选择为内容提供字符串或正则表达式:
context 'with compress => true' do
let(:params) { {:compress => true} }
it do
should contain_file('/etc/logrotate.d/nginx') \
.with_content(/^\s*compress$/)
end
end
context 'with compress => false' do
let(:params) { {:compress => false} }
it do
should contain_file('/etc/logrotate.d/nginx') \
.with_content(/^\s*nocompress$/)
end
end
这里有完整的描述:http://rspec-puppet.com/tutorial/
template
是 Puppet 解析器的一个函数,因此不适用于您的单元测试。
如果您真的想将现有模板用作固定装置,则必须manually评估其 ERB 代码。
更好的单元测试方法是在测试代码中对测试数据进行硬编码。
if (6 < 7)
context "testing sudo template with rspec" do
let(:params) {{:content => 'SPEC-CONTENT'}}
it {should contain_file('/etc/sudoers').with(
'ensure' => 'present',
'owner' => 'root',
'group' => 'root',
'mode' => '0440',
'content' => 'SPEC-CONTENT'}
end
end
在验收或集成测试领域使用实际有效的模板更有趣。