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

时间:2019-05-04 09:05:35

标签: puppet rspec-puppet

我有如下的木偶食谱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函数并返回true / false,然后我必须检查新创建文件的内容。 如何使用rspec模块模拟validate_cmd命令? 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:4)

最简单的答案是,这是不可能的,您需要使用Beaker,Test Kitchen等工具。

要获得更长的答案,我将带您到Rspec木偶tutorial

  

许多人对这些测试的目的感到困惑,因为他们无法在实时系统上测试清单的结果。那不是rspec-puppet的重点。 Rspec-puppet测试可以测试Puppet将清单编译为Puppet资源目录时的行为。

关键是Rspec-puppet永远不会应用它编译的目录;它仅检查编译的目录,并允许您声明其中的内容。但是,要观察行为以响应您的validate_cmd所做的不同,您确实需要在真实系统上应用目录。

当然,在Beaker或Test Kitchen中设置系统并不是一件容易的事,这样您的脚本也将返回两个不同的值。此外,您真正要测试什么。您不是在测试Puppet本身是否按承诺做吗?如果是这样,您真的不应该尝试进行测试。

或者,这是您自己编写的脚本吗?如果是这样,请考虑使用shunit2BATS之类的Bash单元测试框架。相反,请证明您的Shell脚本的行为符合您期望的操作系统响应方式。