2014-01-29 12 views
7

我試圖用ChefSpec測試角色。我寧願不使用Chef Zero(通過要求'chefspec/server'),因爲它比ChefSpec自己運行速度慢一點。NoMethodError:當使用ChefSpec測試角色時未定義的方法`run_list_for'

也許我正在閱讀錯誤的文檔,但它看起來不像廚師零是測試角色所必需的。然而,我還沒有運用我目前的配置。這是我的測試:

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)>' 

如果我修改我的測試通過要求chefspec/server手動加載角色到廚師零,這似乎工作。我認爲我不應該從寫文檔的方式來嘲笑服務器,但我可能是錯的。

我做錯了什麼?這是一個錯誤?還是必須使用Chef Zero?

+0

「run_list_for」方法不會出現在ChefSpec或Chef Zero中。我能看到你的方法嗎? – sethvargo

+0

'run_list_for'(如果這就是你所指的)不是我自己的方法,它似乎與廚師有關。堆棧跟蹤在'expect(chef_run)'行生成,並且默認配方本身是空的。我能找到的唯一參考資料是一些與舊版本廚師獨奏(版本10)相關的帖子,當JSON不包含特定屬性值時(例如「json_class」:「Chef :: Role」),會發出相同的異常。我添加了JSON內容,讓我知道是否還有其他我可以發佈的內容可能會有所幫助。 – user949286

+0

什麼版本的ChefSpec? – sethvargo

回答

16

如果使用JSON的角色,你必須包括json_class

"json_class": "Chef::Role" 

如果您在使用Ruby的角色,你並不需要做的。

+0

謝謝! :) – hek2mgl

相關問題