2014-01-29 4 views
7

Я пытаюсь проверить роль с помощью ChefSpec. Я бы предпочел не использовать Chef Zero (требуя «chefspec/server») только потому, что он работает немного медленнее, чем ChefSpec делает сам по себе.NoMethodError: undefined method `run_list_for 'при тестировании роли с помощью ChefSpec

Возможно, я неправильно читаю документацию, но это не похоже на то, что шеф-повар необходим для проверки роли. Однако мне не повезло с моей текущей конфигурацией. Это мой тест:

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 

Роль (находится в роли/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)>' 

Если я изменяю мой тест, чтобы вручную загрузить роль в Chef Zero, требуя chefspec/server, что похоже на работу. Я не думаю, что мне следовало бы издеваться над сервером из того, как написана документация, но я могу ошибаться.

Я что-то не так? Это ошибка? Или я должен использовать Chef Zero?

+0

Метод 'run_list_for' не отображается в ChefSpec или Chef Zero. Могу ли я увидеть ваш метод? – sethvargo

+0

'run_list_for' (если это то, о чем вы ссылаетесь) не является моим собственным методом, похоже, это связано с шеф-поваром. Трассировка стека генерируется в строке 'expect (chef_run)', и сам рецепт по умолчанию пуст. Единственные ссылки, которые я мог найти, - это некоторые сообщения, связанные со старыми версиями chef solo (версия 10), которые извергали это же исключение, когда JSON не содержал конкретных значений атрибутов (например, «json_class»: «Chef :: Role»). Я добавил содержимое JSON, дайте мне знать, если есть что-нибудь еще, что я могу опубликовать, что может быть полезно. – user949286

+0

Какая версия ChefSpec? – sethvargo

ответ

16

Если вы используете роли JSON, вы должны включать в себя json_class:

"json_class": "Chef::Role" 

Если вы используете роли Ruby, вам не нужно делать это.

+0

Спасибо тонну! :) – hek2mgl