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
区块的地方,如果它甚至可以做到这一点。
这实际上看起来像是一个纯RSpec问题,因为没有扩展匹配器。这种嘲笑资源的方法实际上在起作用吗?我认为那只是一个rspec傀儡帮手宝石的实验性特征。 –
它绝对有效。知道这个技巧是有用的,我认为这是无证的。我可能是错的,但我的理解是,'目录'对象(请注意英国的拼写,而美国拼写'目录'在别处使用)由rspec-puppet提供。 –
够公平的。就像你说的,Puppet实际上在其源代码中使用了'catalog'。我可能应该深入一些。谢谢(你的)信息! –