1

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

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

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

但是,在我自己的模块中,除非我在自己的测试代码中创建该事实,否则我的测试会因“评估错误:未知变量”而失败,这很完美,因为测试套件中没有任何内容可以创建该事实。

现在我可以在我的模块的 spec_helper_local.rb 文件中创建这个事实,但这只会把问题踢到楼上,让谁在他们的模块中包含我的模块。

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

4

2 回答 2

0

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

正如您正确断言的那样,这不会帮助您的模块的下游用户,但这错过了测试套件的重点:完全描述评估模块的环境。

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

于 2017-09-26T12:38:47.523 回答
0

我同意,必须添加模拟来对您对第三方代码的使用进行实际测试是非常烦人的。这尤其令人讨厌,因为您的测试可能会由于代码内部结构的变化而随时失败,例如,突然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”。

于 2019-11-12T23:23:52.583 回答