【问题标题】:Puppet: rake spec could not find class ::splunkPuppet:rake 规范找不到类 ::splunk
【发布时间】:2015-11-24 19:56:12
【问题描述】:

我正在尝试测试我的 puppet 模块,但我收到一条错误消息,提示它找不到类。

我编写了几个内部使用的 Puppet 模块;既然我对木偶有兴趣,我想编写测试。由于遇到问题,我决定从本质上重新开始使用一个新的干净模块来弄清楚我需要做什么。

$puppet module generate wet-splunk
<<snip interactive questions>>
$cd splunk
$rake spec
<path snip>ruby -I/Users/wet/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/rspec-support-3.4.1/lib:/Users/wet/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/rspec-core-3.4.1/lib /Users/wet/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/rspec-core-3.4.1/exe/rspec --pattern spec/\{classes,defines,unit,functions,hosts,integration,types\}/\*\*/\*_spec.rb --color
F

Failures:

  1) splunk with defaults for all parameters should contain Class[splunk]
     Failure/Error: it { should contain_class('splunk') }

     Puppet::PreformattedError:
       Evaluation Error: Error while evaluating a Function Call, Could not find class ::splunk for host.example.com at line 1:1 on node host.example.com
     # ./spec/classes/init_spec.rb:5:in `block (3 levels) in <top (required)>'

Finished in 0.21712 seconds (files took 3.14 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/classes/init_spec.rb:5 # splunk with defaults for all parameters should contain Class[splunk]

/Users/wet/.rbenv/versions/1.9.3-p0/bin/ruby -I/Users/wet/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/rspec-support-3.4.1/lib:/Users/wet/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/rspec-core-3.4.1/lib /Users/wet/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/rspec-core-3.4.1/exe/rspec --pattern spec/\{classes,defines,unit,functions,hosts,integration,types\}/\*\*/\*_spec.rb --color failed

检查文件,尽管我认为它们包含应有的内容:

清单/init.pp

# <snip documentation boilterplate>
class splunk {    
}

spec/classes/init_spec.rb

require 'spec_helper'
describe 'splunk' do

  context 'with defaults for all parameters' do
    it { should contain_class('splunk') }
  end
end

Could not find class ::splunk 是让我感到困惑的部分。

我阅读规范文件的方式是它在 init 内部查找 class{'splunk': ... } 这可能是我误读了它,因为它们会从损坏的规范文件开始看起来很奇怪,但以防万一我尝试测试包。

清单/init.pp

class splunk {
  package{'splunk':
    ensure => 'present',
  }
}

spec/classes/init_spec.rb

require 'spec_helper'
describe 'splunk' do

  context 'with defaults for all parameters' do
    it { should contain_package('splunk') }
  end
end

我仍然收到类似的错误消息:

$ rake spec
/Users/wet/.rbenv/versions/1.9.3-p0/bin/ruby -I/Users/wet/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/rspec-support-3.4.1/lib:/Users/wet/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/rspec-core-3.4.1/lib /Users/wet/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/rspec-core-3.4.1/exe/rspec --pattern spec/\{classes,defines,unit,functions,hosts,integration,types\}/\*\*/\*_spec.rb --color
F

Failures:

  1) splunk with defaults for all parameters should contain Package[splunk]
     Failure/Error: it { should contain_package('splunk') }

     Puppet::PreformattedError:
       Evaluation Error: Error while evaluating a Function Call, Could not find class ::splunk for host.example.com at line 1:1 on node host.example.com
     # ./spec/classes/init_spec.rb:6:in `block (3 levels) in <top (required)>'

Finished in 0.21168 seconds (files took 3.17 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/classes/init_spec.rb:6 # splunk with defaults for all parameters should contain Package[splunk]

很抱歉问了这么一个基本的问题;我真的很感谢你的帮助。我真的很喜欢关于测试 Puppet 代码的优秀教程的链接;我很想使用 Vagrant 来确保我的代码实际上会按照我的意愿去做。

更新: 我相信我遵循了@Peter_Souter 的建议;我仍然收到找不到课程的错误。我发布了引用的文件的内容,以尝试验证我做了正确的事情,以防出现其他错误。

$ cat .fixtures.yml 
fixtures:
  symlinks:
    "splunk": "#{source_dir}"
$ cat spec_helper.rb 
require 'puppetlabs_spec_helper/module_spec_helper'
$ cat Rakefile 
require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-lint/tasks/puppet-lint'
PuppetLint.configuration.send('disable_80chars')
PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp"]

desc "Validate manifests, templates, and ruby files"
task :validate do
  Dir['manifests/**/*.pp'].each do |manifest|
    sh "puppet parser validate --noop #{manifest}"
  end
  Dir['spec/**/*.rb','lib/**/*.rb'].each do |ruby_file|
    sh "ruby -c #{ruby_file}" unless ruby_file =~ /spec\/fixtures/
  end
  Dir['templates/**/*.erb'].each do |template|
    sh "erb -P -x -T '-' #{template} | ruby -c"
  end
end
$ cat Gemfile
source 'https://rubygems.org'

puppetversion = ENV.key?('PUPPET_VERSION') ? "#{ENV['PUPPET_VERSION']}" : ['>= 3.3']
gem 'puppet', puppetversion
gem 'puppetlabs_spec_helper', '>= 0.8.2'
gem 'puppet-lint', '>= 1.0.0'
gem 'facter', '>= 1.7.0'

gem 'rspec-puppet', '~> 2.1',  :require => false
gem 'rspec-core', '3.1.7',     :require => false

【问题讨论】:

  • 嗯,我们在某处忘记了一些东西......我已经用你的例子制作了一个工作存储库:github.com/petems/splunk-stack-overflow-example你能试试吗?如果这对您有用,请尝试在两个目录之间进行比较:)
  • 如果您使用新的 Puppet 开发工具包,所有这些都可以避免 - 请参阅 puppet.com/blog/…

标签: testing rspec puppet rspec-puppet


【解决方案1】:

rspec-puppet 模拟目录进行测试的方式,它创建了一个包含所需模块的fixtures 目录。所以现在它在一个空目录上运行它,所以它找不到你的模块。我们通常使用 puppetlabs-spec-helper 来解决这个问题,它会在该固定装置目录中创建一个指向您当前存储库的 simlink。

我建议将以下内容添加到您的文件中:

# .fixtures.yml 
fixtures:
  symlinks:
    "splunk": "#{source_dir}"

# spec_helper.rb
require 'puppetlabs_spec_helper/module_spec_helper'

# Rakefile
require 'puppetlabs_spec_helper/rake_tasks'

# Gemfile
gem 'rspec-puppet', '~> 2.1',  :require => false
gem 'rspec-core', '3.1.7',     :require => false

你可以试试,告诉我它是否适合你?

【讨论】:

  • 在生成后创建 .fixtures.yml 确实使测试工作。我一定是不小心改变了一些东西,弄坏了它;在让它与差异一起工作后,我开始尝试准确缩小必要的范围,并发现这是唯一必要的步骤。
  • 我相信除非您为它运行 rake 任务,否则不会实际创建灯具(rake spec_prep 是实际创建它们的步骤,rake spec 也有它?),所以它可能没有跑吧……但很高兴我能帮上忙! :)
  • 这会在第一行引发错误:[Execute spec_prep] Found malformed YAML in .fixtures.yml on line __ column _: could not find expected ':'
【解决方案2】:

如果有人像我一样偶然发现这个话题。对我来说正确答案在:

Why do I get puppet-rspec 'class does not exist' when it does?

表示你必须做的:

puppet module generate foo-bar

然后解决这个问题

bundle exec rspec-puppet-init

这不是很好,但比处理隐藏的点文件更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多