我创建了一个 Chef 资源,它“扩展”了 Chef 的部署资源。基本思想是检查文件 deploy/crontab
是否存在类似于机制 deploy/after_restart.rb
在要部署的源中,并从中创建 cronjobs。
虽然此机制按其应有的方式工作(请参阅 https://github.com/fh/easybib-cookbooks/blob/t/cron-tests/easybib/providers/deploy.rb#L11-L14 ),但我正在努力进行基于 ChefSpec 的测试。我目前正在尝试使用 FakeFS
创建模拟- 但是当我在 Chef 运行之前模拟文件系统时,运行失败,因为没有找到食谱,因为它们不存在于模拟的文件系统中。如果我不这样做,模拟文件 deploy/crontab
显然没有找到,所以提供者不做任何事情。我目前的做法是触发FakeFS.activate!
之前runner.converge(described_recipe)
在chef_run 中。
我很想听听一些关于如何在此处进行适当测试的建议:是否有可能仅在部署资源运行之前直接启用 FakeFS,或者仅部分模拟文件系统?
最佳答案
我在 stub 文件系统类时遇到了类似的问题。我一直在解决这个问题的方法如下。
::File.stub(:exists?).with(anything).and_call_original
::File.stub(:exists?).with('/tmp/deploy/crontab').and_return true
open_file = double('file')
allow(open_file).to receive(:each_line).and_yield('line1').and_yield('line2')
::File.stub(:open).and_call_original
::File.stub(:open).with('/tmp/deploy/crontab').and_return open_file
关于rspec - 在 ChefSpec 运行期间模拟文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22614837/