5

我创建了一个厨师资源,它“扩展”了厨师的部署资源。基本思想是检查是否存在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这样做,则显然找不到模拟文件,因此提供者不会做任何事情。我目前的做法是在chef_runFakeFS.activate!之前直接触发。runner.converge(described_recipe)

我很想听听一些关于如何在这里进行适当测试的建议:是否有可能仅在部署资源运行之前直接启用 FakeFS,或者仅部分模拟文件系统?

4

2 回答 2

5

我在存根文件系统类时遇到了类似的问题。我一直在解决这个问题的方法如下。

::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
于 2014-03-26T09:14:14.340 回答
5

由于punkle的解决方案在语法上已被弃用并且缺少一些部分,我将尝试提供一个新的解决方案:

require 'spec_helper'

describe 'cookbook::recipe' do

  let(:chef_run) { ChefSpec::SoloRunner.converge(described_recipe) }


  file_content = <<-EOF
...here goes your
multiline
file content
EOF

  describe 'describe what your recipe should do' do

    before(:each) do
      allow(File).to receive(:exists?).with(anything).and_call_original
      allow(File).to receive(:exists?).with('/path/to/file/that/should/exist').and_return true
      allow(File).to receive(:read).with(anything).and_call_original
      allow(File).to receive(:read).with('/path/to/file/that/should/exist').and_return file_content
    end

    it 'describe what should happen with the file...' do
      expect(chef_run).to #...
    end
  end

end
于 2015-07-31T08:38:52.857 回答