使用RSpec测试Puppet自定义函数,为什么我看不到facter变量?

时间:2014-01-16 14:23:38

标签: rspec puppet

根据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变量以测试使用它们的自定义函数(事实)???

2 个答案:

答案 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方法的自定义匹配器。在说这个时,我假设scopelookupvar都不是来自那个宝石。