2016-09-16 108 views
0

鑑於小例子如何編寫自定義廚師資源的迴歸測試?

# resources/novowel.rb 
resource_name :novowel 
property :name, String, name_property: true, regex: /\A[^aeiou]\z/ 

我想編寫單元測試中spec/unit/resources/novowel_spec.rb

  • 資源「novowel」的名稱應該接受「K」
  • 資源「novowel」的名稱應接受'&'
  • 資源'novowel'的名稱不應該接受'a'
  • 資源'novowel'爲名稱不應該接受'mm'

確保名稱屬性仍然正常工作,即使正則表達式由於某種原因而更改。

我瀏覽了幾個頂尖的廚師食譜,但無法找到這種測試的參考。

怎麼辦?如果能幫助完成任務,請隨意提供更復雜的示例,並明確說明子類別Chef::Resource

更新1:當物業不適合regex時,廚師是否會失敗?顯然,這不應該工作:

link '/none' do 
    owner 'r<oo=t' 
    to  '/usr' 
end 

chef-apply(37年12月13日)不抱怨r<oo=t不匹配owner_valid_regex。它簡單地收斂,好像owner不會被提供。

回答

0

我們換一個小紅寶石內部DSL,以瞭解資源的Ruby類的名稱:

# libraries/no_vowel_resource.rb 
require 'chef/resource' 

class Chef 
    class Resource 
    class NoVowel < Chef::Resource 
     resource_name :novowel 
     property :letter, String, name_property: true, regex: /\A[^aeiou]\z/ 
     property :author, String, regex: /\A[^aeiou]+\z/ 
    end 
    end 
end 

,現在我們可以使用RSpec的與

# spec/unit/libraries/no_vowel_resource_spec.rb 
require 'spec_helper' 

require_relative '../../../libraries/no_vowel_resource.rb' 

describe Chef::Resource::NoVowel do 
    before(:each) do 
    @resource = described_class.new('k') 
    end 

    describe "property 'letter'" do 
    it "should accept the letter 'k'" do 
     @resource.letter = 'k' 
     expect(@resource.letter).to eq('k') 
    end 

    it "should accept the character '&'" do 
     @resource.letter = '&' 
     expect(@resource.letter).to eq('&') 
    end 

    it "should NOT accept the vowel 'a'" do 
     expect { @resource.letter = 'a' }.to raise_error(Chef::Exceptions::ValidationFailed) 
    end 

    it "should NOT accept the word 'mm'" do 
     expect { @resource.letter = 'mm' }.to raise_error(Chef::Exceptions::ValidationFailed) 
    end 
    end 

    describe "property 'author'" do 
    it "should accept a String without vowels" do 
     @resource.author = 'cdrngr' 
     expect(@resource.author).to eq('cdrngr') 
    end 

    it "should NOT accept a String with vowels" do 
     expect { @resource.author = 'coderanger' }.to raise_error(Chef::Exceptions::ValidationFailed) 
    end 
    end 
end 
+0

這隻適用於名稱屬性(順便說一句,不應該稱爲':name')。 – coderanger

+0

@coderanger我不同意。當然你可以指定任何這樣的財產。見上面的擴展示例。 – arney

+0

@coderanger你能解釋爲什麼有一個名爲'name'的屬性可能會產生問題嗎? – arney

2

您可以使用ChefSpec和RSpec。我在我的所有烹飪書中都有例子(例如https://github.com/poise/poise-python/tree/master/test/spec/resources),但我也在ChefSpec上使用了一些自定義助手,所以它可能不是很有幫助。在規格中使用聯機配方代碼塊使其更容易。我已經開始在https://github.com/poise/poise-spec中提取我的助手以供外部使用,但尚未完成。目前的幫手都在我的Halite寶石中,請參閱readme瞭解更多信息。

+0

爲了回答您的編輯,財產驗證只在訪問屬性時運行,而不是在設置時運行。有_reasons_這個 – coderanger

+0

「訪問屬性」是什麼意思?就像[這個問題](http://stackoverflow.com/q/25043690/2216961)? – arney

+0

'owner'和'to'是資源屬性。在提供者代碼中,我們使用'new_resource.owner'來獲取該屬性的值並對其進行處理。驗證碼然後發生。由於ChefSpec存根提供者,可能會導致一個屬性永遠不會被訪問,所以無效的值是允許的。 – coderanger