2017-05-07 65 views
1

我有一堆的重複代碼操縱木偶目錄對象(注意重複content =線)的輔助方法:如何定義用於操縱木偶目錄對象

require 'nokogiri' 

describe 'role::jenkins' do 
    before(:each) do 
    @jobs = catalogue.resource_keys.select{|k,v| k == 'Jenkins::Jobs'}.map{|k,v| v} 
    end 

    it 'Jenkins jobs should be valid XML' do 
    @jobs.each do |j| 
     content = catalogue.resource('file', "/tmp/#{j}.xml").send(:parameters)[:content] 
     result = Nokogiri::XML(content).errors.empty? 
     if ! result 
     puts " Job #{j} does NOT have valid XML" 
     end 
     expect(result).to be true 
    end 
    end 

    it "XML should contain a variables.json snippet that is valid JSON" do 
    @jobs.each do |j| 
     content = catalogue.resource('file', "/tmp/#{j}.xml").send(:parameters)[:content] 
     if content.match(/cat << EOF > #{json_file}.*?EOF/m) 
     json_snippet = content.match(/#{json_file}(.*?)EOF/m)[1] 
     expect { JSON.parse(json_snippet) }.to_not raise_error 
     end 
    end 
    end 
end 

如可以看到的,我已經移動對before(:each)塊進行長查詢並將其保存在實例變量中。這使它在it塊中可用。

我不明白的是我怎麼能定義一個方法爲content =線,如:

def content(file_name) 
    catalogue.resource('file', file_name).send(:parameters)[:content] 
end 

如果我知道該怎麼做,我可以大大清理此代碼。我想不出的是我可以放置這個def區塊的地方,如果它甚至可以做到這一點。

+0

這實際上看起來像是一個純RSpec問題,因爲沒有擴展匹配器。這種嘲笑資源的方法實際上在起作用嗎?我認爲那只是一個rspec傀儡幫手寶石的實驗性特徵。 –

+1

它絕對有效。知道這個技巧是有用的,我認爲這是無證的。我可能是錯的,但我的理解是,'目錄'對象(請注意英國的拼寫,而美國拼寫'目錄'在別處使用)由rspec-puppet提供。 –

+0

夠公平的。就像你說的,Puppet實際上在其源代碼中使用了'catalog'。我可能應該深入一些。謝謝(你的)信息! –

回答

0

我犯了一個愚蠢的錯誤(以爲我已經嘗試了一些事實上我沒有)。

答案是隻要把defbefore塊內以及:

require 'nokogiri' 

describe 'role::jenkins' do 
    before(:each) do 
    @jobs = catalogue.resource_keys.select{|k,v| k == 'Jenkins::Jobs'}.map{|k,v| v} 

    def content(file_name) 
     catalogue.resource('file', file_name).send(:parameters)[:content] 
    end 
    end 

    it 'Jenkins jobs should be valid XML' do 
    @jobs.each do |j| 
     result = Nokogiri::XML(content("/tmp/#{j}.xml").errors.empty? 
     if ! result 
     puts " Job #{j} does NOT have valid XML" 
     end 
     expect(result).to be true 
    end 
    end 

    it 'XML should contain a variables.json snippet that is valid JSON' do 
    @jobs.each do |j| 
     content = content("/tmp/#{j}.xml") 
     if content.match(/cat << EOF > #{json_file}.*?EOF/m) 
     json_snippet = content.match(/#{json_file}(.*?)EOF/m)[1] 
     expect { JSON.parse(json_snippet) }.to_not raise_error 
     end 
    end 
    end 
end 

請讓我知道,但如果任何人都可以看到,可以作出任何進一步的改進!