给出最小的例子
# resources/novowel.rb
resource_name :novowel
property :name, String, name_property: true, regex: /\A[^aeiou]\z/
我想在spec/unit/resources/novowel_spec.rb
确保即使由于某种原因更改了正则表达式,name属性仍然可以正常工作。
我浏览了几个顶级厨师食谱,但找不到这种测试的参考资料。
怎么做?如果有助于实现任务,请随意提供更复杂的示例,并明确继承Chef::Resource
。
更新1:当某个属性不适合regex
时,Chef是否会失败?显然这不起作用:
link '/none' do
owner 'r<oo=t'
to '/usr'
end
但chef-apply
(12.13.37)并未抱怨r<oo=t
与owner_valid_regex
不匹配。它简单地收敛,好像不会提供owner
。
答案 0 :(得分:2)
您将使用ChefSpec和RSpec。我在所有的食谱中都有例子(例如https://github.com/poise/poise-python/tree/master/test/spec/resources)但我也在普通的ChefSpec上使用了一堆自定义助手,所以它可能不是很有帮助。在规范中执行内联配方代码块使其更容易。我已经开始在https://github.com/poise/poise-spec中提取我的助手以供外部使用,但它还没有完成。目前的帮助者在我的Halite宝石中,请参阅那里的自述文件以获取更多信息。
答案 1 :(得分:0)
我们将DSL包装在一个小Ruby中,以便知道资源的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