3

ChefSpec テストを実行しようとしています。

これは私のChefSpecテストです:

require_relative '../spec_helper'

describe 'my-demo::basesystem' do

  let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe)}

  describe 'basesystem' do

    it "should be installed" do
      expect(chef_run).to install_package('build-essential')
    end
  end
end

そして私のレシピです

include_recipe 'build-essential::default'

ChefSpec テストを実行したときのエラー出力でした

================================================================================
Recipe Compile Error in /tmp/d20140208-11211-1tu0tmq/my-demo/recipes/basesystem.rb
================================================================================

Chef::Exceptions::CookbookNotFound
----------------------------------
Cookbook build-essential:: not found. If you're loading build-essential:: from another cookbook, make sure you configure the dependency in your metadata

Cookbook Trace:
---------------
  /tmp/d20140208-11211-1tu0tmq/build-essential/recipes/default.rb:21:in `from_file'
  /tmp/d20140208-11211-1tu0tmq/my-demo/recipes/basesystem.rb:2:in `from_file'

Relevant File Content:
----------------------
/tmp/d20140208-11211-1tu0tmq/build-essential/recipes/default.rb:

 14:  # distributed under the License is distributed on an "AS IS" BASIS,
 15:  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 16:  # See the License for the specific language governing permissions and
 17:  # limitations under the License.
 18:  #
 19:  
 20:  begin
 21>>   include_recipe "build-essential::#{node['platform_family']}"
 22:  rescue Chef::Exceptions::RecipeNotFound
 23:    Chef::Log.warn "A build-essential recipe does not exist for the platform_family: #{node['platform_family']}"
 24:  end
 25:  


Chef::Exceptions::CookbookNotFound: Cookbook build-essential:: not found. If you're loading build-essential:: from another cookbook, make sure you configure the dependency in your metadata
/tmp/d20140208-11211-1tu0tmq/build-essential/recipes/default.rb:21:in `from_file'
/tmp/d20140208-11211-1tu0tmq/my-demo/recipes/basesystem.rb:2:in `from_file'
./spec/recipes/base_system_spec.rb:5:in `block (2 levels) in <top (required)>'
./spec/recipes/base_system_spec.rb:8:in `block (2 levels) in <top (required)>'

1 example, 1 failure, 0 passed

Finished in 0.062297226 seconds

Process finished with exit code 1

何が問題なのかわかりません。Berkshelf がクックブックの依存関係を解決できると思いました。

4

1 に答える 1

7

スタックトレースを見ると:

20:  begin
21>>   include_recipe "build-essential::#{node['platform_family']}"
22:  rescue Chef::Exceptions::RecipeNotFound
23:    Chef::Log.warn "A build-essential recipe does not exist for the platform_family: #{node['platform_family']}"
24:  end

21 行目で、build-essential クックブックが現在のノードのプラットフォーム ファミリーに対応するレシピを読み込もうとしていることがわかります。ただし、ChefSpec の場合、偽装するノードの種類を ChefSpec に具体的に指示しない限り、そのデータは設定されません。つまり、node['platform_family']nilであり、 という名前のレシピを含めようとしていますが、これbuild-essential::(nothing)は有効ではありません。

これを修正するには、platform_family の値を次のように設定します。

let(chef_run) do
  ChefSpec::Runner.new do |node|
    node.automatic['platform_family'] = 'ubuntu'
  end.converge(described_recipe)
end

または (推奨)、ChefSpec にノードを偽装するように指示できます。

let(:chef_run) { ChefSpec::Runner.new(platform: 'ubuntu', version: '12.04').converge(described_recipe) }
于 2014-02-11T04:28:28.310 に答える