rspec - 在 ChefSpec 运行期间模拟文件

标签 rspec chef-infra chefspec

我创建了一个 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/

相关文章:

ruby - 你如何在 Rspec 中模拟/ stub 反引号系统调用?

chef-infra - Chef Knife 发出 GSSAPI C 库警告

unit-testing - 如何创建在另一个配方中定义的虚拟资源而不在测试运行中包含另一个配方?

ruby - ChefSpec 和 Ark 资源测试

chef-infra - 无方法错误 : undefined method `run_list_for' when testing role with ChefSpec

ruby-on-rails - 在 Capybara 中使用 Given/Let w/Feature/Scenario

ruby-on-rails - spec/rails_helper.rb 与 spec/spec_helper.rb 有何不同?我需要它吗?

ruby-on-rails - 使用 Capybara 将 GET 参数传递给 Controller

ruby - Vagrant 与 librarian-chef 通过 ruby​​_build & rbenv 安装 ruby

python - 在 Chef Recipe 中执行requirements.txt文件来安装python模块的正确方法是什么?