根据http://docs.puppetlabs.com/guides/custom_functions.html#using-facts-and-variables,我应该能够通过调用lookupvar
来访问事实module Puppet::Parser::Functions
newfunction(:machinelist2, :type => :rvalue) do
lookupvar('operatingsystem')
end
end
在规范中使用它,它返回nil。
context 'something' do
let(:facts) {{:operatingsystem => 'blah'}}
it "should return os" do
result = scope.function_machinelist2([])
result.should(eq('blah'))
end
end
(并运行规范...) $ rspec
machinelist2 function
should exist
something
should return os (FAILED - 1)
Failures:
1) machinelist2 function something should return os
Failure/Error: result.should(eq('blah'))
expected: "blah"
got: nil
(compared using ==)
# ./spec/parser/functions/machinelist2_spec.rb:17
Finished in 0.12478 seconds
2 examples, 1 failure
Failed examples:
rspec ./spec/parser/functions/machinelist2_spec.rb:15 # machinelist2 function something should return os
即使我删除let(:facts)条目,我也希望facter变量能够解析为当前的操作系统。
在我的“常规”木偶代码(类/模块清单)的rspec-puppet测试中肯定会这样做
更新 我错过了文档的一部分:
要使用有关客户端的事实,请使用lookupvar('FACT NAME')代替 Facter ['FACT NAME']。价值。如果事实不存在,则为lookupvar 返回:
所以,我尝试了相反的方法,并使用了Facter ['operatingsystem']。value。 这将返回我当前的操作系统,但我无法使用let()覆盖它。
所以,我的问题是,如何覆盖facter变量以测试使用它们的自定义函数(事实)???
答案 0 :(得分:4)
我偶然发现了一些例子,现在看来很明显,因为"原始红宝石"自定义函数的性质,存根将起作用!
e.g。
scope.stubs(:lookupvar)。。随着("接口&#34)返回(' eth0的,LO&#39)
这是一个更完整的例子......
require 'spec_helper'
require 'puppetlabs_spec_helper/puppetlabs_spec/puppet_internals'
describe "machinelist2 function" do
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }
it "should exist" do
Puppet::Parser::Functions.function("machinelist2").should == "function_machinelist2"
end
context 'something' do
it "should return os" do
scope.stubs(:lookupvar).with("operatingsystem").returns('blah')
result = scope.function_machinelist2([])
result.should(eq('blah'))
end
end
果然......
rjames@ma-dt-rj:facts$ rspec
machinelist2 function
should exist
something
should return os
Finished in 0.12552 seconds
2 examples, 0 failures
所以......只要我可以依赖lookupvar()在运行实际的木偶代码(在rspec之外)时工作,那么我认为这应该很有效。
答案 1 :(得分:0)
我对基本的傀儡问题没有任何见解,但我怀疑你的let
电话没有任何效果,因为let
方法被懒惰地评估,而你似乎没有使用任何方法rspec-puppet gem中可能使用facts
方法的自定义匹配器。在说这个时,我假设scope
和lookupvar
都不是来自那个宝石。