gpt4 book ai didi

ruby - ChefSpec 不应测试包含的 Recipe

转载 作者:数据小太阳 更新时间:2023-10-29 07:16:04 24 4
gpt4 key购买 nike

我已经为安装 Jenkins CI 制作了一本说明书。它使用 yum Recipe 中的 keyrepository 资源,所以我最终得到以下配方:

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

当我将此 Recipe 包含在另一个 Recipe 中时:

include_recipe 'sp_jenkins::default'

我使用以下 ChefSpec 测试对此进行了测试

it 'includes the `sp_jenkins::default` recipe' do
expect(chef_run).to include_recipe('sp_jenkins::install')
end

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

NameError:
Cannot find a resource for yum_key on chefspec version 0.6.1

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

sp_jenkins cookbook 确实依赖于 yum cookbook (metadata.rb),并且运行良好,但是,我目前正在编写的 cookbook 不依赖于yum Recipe ,因此没有可用的 yum_keyyum_repository 方法。

有没有一种方法可以防止 ChefSpec“下降”到包含的 Recipe/Recipe 中并只测试当前的 Recipe ?

最佳答案

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

因此,就像您需要 yum Recipe 将此 Recipe 收敛到真实节点上一样,您也需要它在使用 ChefSpec 进行单元测试期间收敛。实现此目的的最简单方法是使用 Berkshelf 或 Librarian 解析器。使用 Berkshelf resolver , 在要求 chefspec 之后简单地 require 'chefspec/berkshelf':

# spec_helper.rb
require 'chefspec'
require 'chefspec/berkshelf'

如果您的系统上安装了 Berkshelf,它将把所有的 Recipe 拉到一个临时目录中并为您运行 ChefSpec。

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


顺便说一句,我正在做一个相当 large refactor to the Jenkins cookbook 的工作这可能更适合您的需求。


来源:

  • 我写的...

关于ruby - ChefSpec 不应测试包含的 Recipe ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20547683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com