我有以下厨师食谱:
# recipes/default.rb
include_recipe 'my-cookbook::another_recipe'
execute 'Do some stuff' do
command "echo some stuff"
action :run
end
template "my_dir/my_file.txt" do
source "my_file.txt.erb"
owner 'myuser'
group 'mygroup'
notifies :restart, resources(:service => 'my-service'), :delayed
end
和另一个食谱
# recipes/another_recipe.rb
service 'my-service' do
start_command "my-service start"
stop_command "my-service stop"
supports :start => true, :stop => true
action :nothing
end
现在我想单独为default
食谱编写一个 Chefspec 单元测试。所以我写了这个:
# spec/unit/recipes/default_spec.rb
require 'rspec/core'
require 'chefspec'
describe 'my-cookbook::default' do
let(:chef_run) { ChefSpec::SoloRunner.converge(described_recipe) }
before do
allow_any_instance_of(Chef::Recipe).to receive(:include_recipe).with('my-cookbook::another_recipe')
end
it "Does the stuff" do
expect(chef_run).to run_execute("echo some stuff")
end
end
我如何创建一个虚拟的服务another_recipe
来防止这种情况发生:
11: group 'mygroup'
12>> notifies :restart, resources(:service => 'my-service'), :delayed
13: end
...
Failure/Error: let(:chef_run) { ChefSpec::SoloRunner.converge(described_recipe) }
Chef::Exceptions::ResourceNotFound:
Cannot find a resource matching service[my-service] (did you define it first?)
我知道这可能是一个糟糕的设计和一个相当简单的新手问题,但我真的被困在这里,我的情况是这样的:
- 我有几个月的 Chef 经验,但除此之外没有 Ruby 经验
- 这是一个生产代码,最初是在没有任何单元测试的情况下编写的
- 真正的代码包含更多的东西,这里的这些代码片段只是特定问题的模型
- 我的任务是修改
default
配方,所以我想添加一些单元测试来验证我的修改是否有效并且不会破坏现有功能 - 在这一点上,我想尽可能避免修改任何其他文件(即
another_recipe
) - 如果我也让测试运行,
another_recipe
那么我需要模拟并设置它需要的太多其他东西
谢谢 :) k6ps