Rspec puppet模块测试:访问包含类的自定义事实

时间:2016-09-19 22:33:03

标签: ruby testing rspec puppet rspec-puppet

是否有用于为puppet模块编写规范测试的标准模式,正确创建测试模块包含的模块所需的自定义事实?

我有一个类包含puppetlabs/mongodb的模块,它使用自定义事实:: root_home(由puppetlabs / stdlib创建)。

查看mongodb的测试代码(特别是spec_helper_local.rb),我看到代码创建了:root_home事实进行测试。

但是,在我自己的模块中,除非我在自己的测试代码中做了一些事情来创建这个事实,我的测试失败了“评估错误:未知变量”,这是完美的,因为测试套件中的任何内容都没有创建这个事实。

现在我可以在我的模块的spec_helper_local.rb文件中创建这个事实,但这只是将问题解决到楼上的问题,无论是谁包含我的模块。

我该如何处理?是否有人已经编写了递归下降到包含模块的代码并创建了测试所需的事实?

2 个答案:

答案 0 :(得分:0)

将自定义事实添加到您的测试套件设置中正是您应该做的。

正如你所说的那样,这对你的模块的下游用户没有帮助,但却忽略了测试套件的重点:完全描述评估模块的环境。

您可以查看rspec-puppet-facts为您的所有测试设置默认事实(并在此过程中获得一些其他漂亮的功能)。

答案 1 :(得分:0)

我同意,必须添加模拟以对您使用第三方代码的情况进行实际测试,这非常烦人。尤其令人讨厌的是,由于该代码内部的更改(例如,从stdlib突然引入root_home事实),您的测试随时可能失败。

我已添加到spec/spec_helper.rb的顶部:

if ENV.include? 'MODULEPATH'
  top_path = File.dirname(File.dirname(__FILE__))
  ENV['FACTERLIB'] = ENV['MODULEPATH'].split(/:/).map do |p|
    p.start_with?('/') ? p : File.join(top_path, p)
  end.map do |p|
    Dir.glob(File.join(p, '*/lib/facter'))
  end.flatten.join(':')
end

加载Facter库时,它将使用FACTERLIB环境变量并评估您环境中模块提供的所有自定义事实。

MODULEPATH的典型值在测试环境时为“ design:modules”,而在测试模块时为“ spec / fixtures / modules”。