ChefSpec不应该测试包含的食谱

mta*_*tak 5 ruby rspec chef-infra chefspec

我已经建立了一个用于安装Jenkins CI的食谱.它使用了食谱中的资源keyrepository资源yum,所以我最终得到了以下食谱:

yum_key "RPM-GPG-KEY-jenkins" do
  url "http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key"
  action :add
end

yum_repository "jenkins" do
  description "Jenkins-CI 3rd party repository"
  url "http://pkg.jenkins-ci.org/redhat"
  key "RPM-GPG-KEY-jenkins"
  action :add
end
Run Code Online (Sandbox Code Playgroud)

当我将这个食谱包含在另一个食谱中:

include_recipe 'sp_jenkins::default'
Run Code Online (Sandbox Code Playgroud)

我用以下的ChefSpec测试来测试它

it 'includes the `sp_jenkins::default` recipe' do
  expect(chef_run).to include_recipe('sp_jenkins::install')
end
Run Code Online (Sandbox Code Playgroud)

我的ChefSpec测试失败,输出如下:

NameError:
  Cannot find a resource for yum_key on chefspec version 0.6.1
Run Code Online (Sandbox Code Playgroud)

(我不确定为什么它说版本0.6.1,gem list告诉我它使用的是3.0.2)

sp_jenkins食谱确实取决于yum食谱(metadata.rb),并运行正常,但是,我目前正在写不依赖于菜谱yum食谱,因此不具备yum_keyyum_repository方法可用.

有没有办法阻止ChefSpec"降序"到包含的食谱/烹饪书中,只测试当前的食谱?

set*_*rgo 3

哎呀!Julian 是正确的 - ChefSpec 实际上在本地计算机的内存中运行Chef Solo 。它将提供者操作重写为 noop,但创建了所有所采取操作的注册表(包括执行通知时将采取的操作)。

因此,就像您需要yum说明书将这个菜谱聚合到真实节点上一样,您也需要它在使用 ChefSpec 进行单元测试期间聚合。实现此目的的最简单方法是使用 Berkshelf 或 Librarian 解析器。要使用Berkshelf 解析器,只需require 'chefspec/berkshelf'在要求之后chefspec

# spec_helper.rb
require 'chefspec'
require 'chefspec/berkshelf'
Run Code Online (Sandbox Code Playgroud)

如果您的系统上安装了 Berkshelf,它会将所有说明书放入临时目录并为您运行 ChefSpec。

您可能还想看看Strainer,它旨在解决类似的问题。


顺便说一句,我正在对Jenkins 食谱进行相当大的重构,这可能会更适合您的需求。


资料来源:

  • 我写的...