如何使用 rspec 在人偶中模拟人偶 validate_cmd?

How to mock puppet validate_cmd in puppet using rspec?

我有一本木偶食谱rspec样本测试如下

it {
  is_expected.to contain_file('/etc/resolv.conf')
    .with(
      'ensure' => 'file',
      'owner' => 'root',
      'group' => 'root',
      'mode' => '0444',
      'validate_cmd' => '/var/tmp/checkdns_nameservers.sh',
    )
    .with_content(resolvconf_contents)
    .that_notifies('Service[sshd]')
    .that_notifies('Service[nscd]')
}

问题是这只是检查清单中是否存在 validate_cmd。

我必须模拟 validate_cmd 函数和 returns true/false 并且基于此我必须检查新创建的文件的内容。 如何使用 rspec 模块模拟 validate_cmd 命令? 任何帮助将不胜感激!!

简短的回答是,这是不可能的,您需要使用 Beaker、Test Kitchen 等工具。

要获得更长的答案,我会引导您到 Rspec-puppet tutorial:

There are a lot of people confused by the purpose of these tests as they can’t test the result of the manifest on a live system. That is not the point of rspec-puppet. Rspec-puppet tests are there to test the behaviour of Puppet when it compiles your manifests into a catalogue of Puppet resources.

重点是Rspec-puppet从不应用它编译的目录;它只检查已编译的目录,并允许您对其中的内容做出断言。但是要观察响应您的 validate_cmd 所做的差异的行为,您确实需要在真实系统上应用该目录。

当然,在 Beaker 或 Test Kitchen 中设置系统并非易事,这样您的脚本也将 return 两个不同的值。此外,您真正要测试的是什么。您不是在测试 Puppet 本身是否按照它所承诺的去做吗?如果是这样,你真的不应该尝试测试它。

或者,这是你自己写的脚本吗?如果是这样,请考虑改用 Bash 单元测试框架,例如 shunit2 or BATS。相反,请证明您的 shell 脚本在响应 OS 时按照您期望的方式运行。