NoMethodError:使用ChefSpec测试角色时未定义的方法`run_list_for'

时间:2014-01-29 20:45:16

标签: chef chefspec

我正在尝试使用ChefSpec测试角色。我宁愿不使用Chef Zero(通过要求'chefspec / server'),因为它的运行速度比ChefSpec自己的运行速度慢一点。

也许我正在阅读文档错误,但看起来不需要Chef Zero来测试角色。但是,我对当前的配置没有任何好运。这是我的考验:

require 'chefspec'

RSpec.configure do |config|
  config.cookbook_path = 'C:\projects\chef\cookbooks'
  config.role_path = 'C:\projects\chef\roles'
  config.log_level = :debug
  config.platform = 'ubuntu'
  config.version = '12.04'
end

describe 'my_cookbook::default' do
  let(:chef_run) do
    ChefSpec::Runner.new.converge('role[my_role]')
  end

  it 'runs without failing' do
    expect(chef_run)
  end
end

角色(位于roles / my_role.json):

{
    "name": "my_role",
    "description": "My role",
    "default_attributes": {
    },
    "run_list": [
        "recipe[my_cookbook::default]"
    ]
}

当我进行测试时,我会收到:

NoMethodError: undefined method `run_list_for' for #<Hash:0x4fa3280>
./spec/role_spec.rb:13:in `block (2 levels) in <top (required)>'
./spec/role_spec.rb:17:in `block (2 levels) in <top (required)>'

如果我修改我的测试以通过要求chefspec/server手动将角色加载到Chef Zero中,那么这似乎有效。我不认为我应该从编写文档的方式来模拟服务器,但我可能是错的。

我做错了吗?这是一个错误吗?或者我必须使用Chef Zero吗?

1 个答案:

答案 0 :(得分:16)

如果您使用的是JSON角色,则必须包含json_class

"json_class": "Chef::Role"

如果您使用的是Ruby角色,则无需执行此操作。