如何在参数需要资源引用时 rspec 测试 Puppet class

How to rspec test a Puppet class when a parameter needs a resource reference

这可能是模拟资源的简单问题,但是...

class myclass (
  String stringParam,
  Integer intParam,
  File fileParam
) {
 # do some things
 $path = fileParam['title']
 $mode = fileParam['mode']
 # do some more things
 }

现在我想为这个 class 编写一个 rspec-puppet 测试。我如何创建或模拟文件资源并将其放入 rspec-puppet 使用的目录中,以便我可以引用它?

this and this 的答案让我半途而废,但我尝试的一切都导致 myClass 抱怨它传递的是字符串而不是文件引用。

...
let(:params) {{
  :stringParam => 'Here is my string',
  :intParam    => 238,
  :fileParam   => *??????,*
}}

rspec-puppet 对此并没有太多支持,因为 class 测试参数列表是从 :params 假设仅字符串(或嵌套 hashes/arrays 等包含字符串)或几乎字面上使用的几个允许的符号值,:undef:default。它无法传递资源引用。

存在一种解决方法,通过传递响应 inspect 方法的对象,您可以将文字内容放入清单中。例如,在您的 spec_helper.rb:

class ResourceReference
  def initialize(ref)
    @ref = ref
  end

  def inspect
    @ref
  end
end

然后在您的规范中:

let(:params) {{
  :stringParam => 'Here is my string',
  :intParam    => 238,
  :fileParam   => ResourceReference.new("File[/etc/foo]"),
}}

rspec-puppet 将调用 ResourceReference 对象上的 inspect 方法,returns 您传入的字符串。这应该放在清单中不变。

(这最初用作 undef 的解决方法,现在可以作为 :undef 传递。)

顺便说一句,您可以设置 let(:pre_condition) { "..." } 在生成的 class { ... } 之前将文字内容添加到测试清单中,但我认为这里没有办法使用它。

我强烈建议针对 rspec-puppet 提交功能请求。