Rspec 在apache_包装器Cookbook中运行chefspec时“找不到Cookbook apache_包装器”

Rspec 在apache_包装器Cookbook中运行chefspec时“找不到Cookbook apache_包装器”,rspec,chef-infra,chefspec,Rspec,Chef Infra,Chefspec,我是厨师规范的新手,尝试在我的食谱中找出如何使用单元测试。 我已经在不同的ubuntu实例和刀子规范插件上安装了chefdkv2和v3。 创建apache_包装烹饪书后,我更改了下一个文件: spec/spec_helper.rb require 'chefspec' require 'chefspec/berkshelf' RSpec.configure do |config| config.log_level = :debug config.platform = 'ubuntu'

我是厨师规范的新手,尝试在我的食谱中找出如何使用单元测试。 我已经在不同的ubuntu实例和刀子规范插件上安装了chefdkv2和v3。 创建apache_包装烹饪书后,我更改了下一个文件:

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
规格/配方/默认规格.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
在my recipe 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
伯克斯菲尔锁

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:

UPD3:

我也试着用next

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)>
我不明白,我做错了什么,今天我开始了新的instans,在那里安装ruby2.1和所有gems,比如chefspec和其他。现在使用rake来运行测试,但仍然会得到相同的错误

解决方案:
只需将元数据添加到cookbooks Berksfile

您必须在cookbooks metadata.rb中指定apache2作为依赖项:

之后,您可以将apache2中的食谱包括在您的食谱中

更新:

此外,您还需要指定apache_包装器烹饪书的位置,有关更多信息,请查看chefspec's

更新2

将元数据添加到您的Berksfile中,BerksShelf将把您的本地食谱添加到本地食谱列表中

从Berkshellf.com:

metadata关键字就像在Bundler的Gemfile中说gempec一样。它说,“在我的Berksfile的相同相对路径中有一个metadata.rb文件”。这允许您解析当前正在处理的烹饪书的依赖项,就像解析当前正在使用Bundler处理的Gem的依赖项一样


请同时发布Berksfile和Berksfile.lock尝试将元数据添加为Berksfile的第三行。另外,如果您使用的是chefspec/berkself插件,则不应使用cookbooks_path。谢谢,但我已经设置了depends和name,还将config.cookbook_path设置为包含cookbook apache_wrapper的文件夹。您是否尝试过使用不同的运行程序运行测试,如:`subject{chefspec::SoloRunner.new.com\u recipe}`似乎ChefSpec::SoloRuner.是的,我还尝试使用next let:chef_run{ChefSpec::ServerRunner.new.converge'apache_wrapper::default'}现在收到丢失的食谱:-------没有这样的食谱:apache_wrapper 412先决条件失败我不明白,我做错了什么,今天我开始了新的实例,在那里安装ruby2.1和所有gems kice chefspec等。你能尝试将你的烹饪书移动到./cookbooks目录,并删除自定义的cookbooks\u路径设置吗,那样的话,你应该有默认的厨师目录结构。我想我已经发现了这个问题,你能尝试更新你的Berksfile,使其与本地烹饪书的检查路径类似吗。之后,安装类似于berks vendor/cookbooks的cookbooks,并将cookbook_路径设置为相同的位置vendor/cookbooks。有了这个你;我们会在同一个地方有所有必要的食谱。
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)>
name             'COOKBOOK NAME'
maintainer       'YOUR NAME'
maintainer_email 'YOUR_EMAIL'
...

version          '0.0.1'

depends          'apache2'