2017-05-07 66 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 

请让我知道,但如果任何人都可以看到,可以作出任何进一步的改进!