1

私はシェフの仕様が初めてで、クックブックで単体テストを使用する方法を理解しようとしています。私はchefdk(異なるubuntuインスタンスにv2とv3)とknife specプラグインをインストールしました。「apache_wrapper」クックブックの作成後、次のファイルを変更しました。

spec/spec_helper.rb

require 'chefspec'
require 'chefspec/berkshelf'

RSpec.configure do |config|
config.log_level = :debug
  config.platform = 'ubuntu'
  config.version = '12.04'
end

仕様/レシピ/default_spec.rb

require_relative '../spec_helper'

describe 'apache_wrapper::default' do
  subject { ChefSpec::Runner.new.converge(described_recipe) }

  it 'includes community cookbook apache2' do
    expect(subject).to include_recipe('apache2')
  end

  it 'creates a template with attributes' do
    expect(subject).to create_template('/var/www/html/index.html').with(
      user:   'root',
      group:  'root',
      backup: true,
    )

    expect(subject).to_not create_template('/var/www/html/index.html').with(
      user:   'bacon',
      group:  'fat',
      backup: true,
    )
  end
end

私のレシピdefault.ebで:

include_recipe 'apache2'

template "/var/www/html/index.html" do
  source "index.html.erb"
  mode 00644
end

しかし、rspec を呼び出すと、次の結果が得られました。

$ pwd
/tmp/apache_wrapper
$ rspec
...
Failures:

  1) apache_wrapper::default includes community cookbook apache2
     Failure/Error: subject { ChefSpec::Runner.new.converge(described_recipe) }
     Chef::Exceptions::CookbookNotFound:
       Cookbook apache_wrapper not found. If you're loading apache_wrapper from another cookbook, make sure you configure the dependency in your metadata
     # ./spec/recipes/default_spec.rb:24:in `block (2 levels) in <top (required)>'
     # ./spec/recipes/default_spec.rb:27:in `block (2 levels) in <top (required)>'

  2) apache_wrapper::default creates a template with attributes
     Failure/Error: subject { ChefSpec::Runner.new.converge(described_recipe) }
     Chef::Exceptions::CookbookNotFound:
       Cookbook apache_wrapper not found. If you're loading apache_wrapper from another cookbook, make sure you configure the dependency in your metadata
     # ./spec/recipes/default_spec.rb:24:in `block (2 levels) in <top (required)>'
     # ./spec/recipes/default_spec.rb:31:in `block (2 levels) in <top (required)>'

Finished in 0.32355 seconds (files took 2.39 seconds to load)
2 examples, 2 failures

Failed examples:

rspec ./spec/recipes/default_spec.rb:26 # apache_wrapper::default includes community cookbook apache2
rspec ./spec/recipes/default_spec.rb:30 # apache_wrapper::default creates a template with attributes

そしてクックブックのフォルダに Berksfile.lock が現れました。誰が私が間違っているのか教えてもらえますか?

更新:

バークスファイル:

source "https://supermarket.getchef.com"
cookbook 'apache2', '= 1.9.6'

Berksfile.lock

DEPENDENCIES
  apache2 (= 1.9.6)

GRAPH
  apache2 (1.9.6)
    iptables (>= 0.0.0)
    logrotate (>= 0.0.0)
    pacman (>= 0.0.0)
  iptables (0.14.0)
  logrotate (1.7.0)
  pacman (1.1.1)

UPD2:

cat ../apache_wrapper/metadata.rb | grep -E 'dep|nam'
name             'apache_wrapper'
depends 'apache2'

UPD3:

また、次に使用しようとしました

let (:chef_run) { ChefSpec::ServerRunner.new.converge 'apache_wrapper::default' } 

そして今受け取る

Missing Cookbooks:
------------------
No such cookbook: apache_wrapper

Expanded Run List:
------------------
* apache_wrapper::default

F

Failures:

  1) apache_wrapper::default includes community cookbook apache2
     Failure/Error: let (:chef_run) { ChefSpec::ServerRunner.new.converge 'apache_wrapper::default' }
     Net::HTTPServerException:
       412 "Precondition Failed "
     # ./spec/default_spec.rb:23:in `block (2 levels) in <top (required)>'
     # ./spec/default_spec.rb:26:in `block (2 levels) in <top (required)>

何を間違っているのかわかりません。今日、新しいインスタンスを開始し、そこに ruby​​2.1 と、chefspec などのすべての gem をインストールしました。そして今、テストを実行するためにrakeを使用していますが、それでも同じエラーが発生します

解決策: クックブック Berksfile に「メタデータ」を追加するだけです

4

1 に答える 1

0

クックブックで依存関係として「apache2」を指定する必要がありますmetadata.rb

name             'COOKBOOK NAME'
maintainer       'YOUR NAME'
maintainer_email 'YOUR_EMAIL'
...

version          '0.0.1'

depends          'apache2'

その後、「apache2」のレシピをクックブックに含めることができます。

アップデート:

また、「apache_wrapper」クックブックの場所を指定する必要があります。詳細については、chefspec の構成オプションを確認してください。

更新 2

Berksfile に追加metadataすると、Berkshelf はローカル クックブックをローカル クックブックのリストに追加します。

berkshelf.com から:

メタデータ キーワードは、Bundler の Gemfile で gemspec と言っているようなものです。「私の Berksfile と同じ相対パス内に metadata.rb ファイルがあります」と表示されます。これにより、Bundler で現在作業している Gem の依存関係を解決するのと同じように、現在作業しているクックブックの依存関係を解決できます。

于 2014-11-18T11:57:36.287 に答える