5

Chef の deploy リソースを「拡張」する Chef リソースを作成しました。基本的な考え方は、デプロイするソースにdeploy/crontabメカニズムに似たファイルが存在するかどうかを確認し、そこから cron ジョブを作成することです。deploy/after_restart.rb

このメカニズムは正常に機能しますが ( https://github.com/fh/easybib-cookbooks/blob/t/cron-tests/easybib/providers/deploy.rb#L11-L14を参照)、私は苦労していますそのためのChefSpecベースのテスト。現在、を使用してモックを作成しようとしていますがFakeFS、Chef を実行する前にファイルシステムをモックすると、モックされたファイルシステムにクックブックが存在しないため、クックブックが見つからないため実行が失敗します。そうしないと、モック ファイルdeploy/crontabが明らかに見つからないため、プロバイダーは何もしません。私の現在のアプローチは、chef_run のFakeFS.activate!直前にトリガーすることです。runner.converge(described_recipe)

ここで適切なテストを行う方法について、いくつかの推奨事項を聞きたいです: FakeFS を deploy-resource-run の直前にのみ有効にするか、ファイルシステムを部分的にのみモックする可能性はありますか?

4

2 に答える 2

5

パンクルのソリューションは構文的に非推奨であり、いくつかの部分が欠けているため、新しいソリューションを提供しようとします。

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 に答える
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 に答える