3
我正在編寫一個chefspec配方,它設置了某些節點屬性,這些屬性是完成我的單元測試所必需的。我目前正在每個測試中設置這些屬性,這看起來很浪費。我希望以這樣一種方式來實現這一點,即我不重複代碼,即「全局屬性?」。chefspec:設置配方中所有測試中使用的全局節點屬性
我目前的工作配方如下:
# encoding: UTF-8
require_relative '../spec_helper'
osd_device = '/ceph-1-osd'
describe 'ceph::per-host-osd' do
let(:runner) { ChefSpec::Runner.new }
let(:chef_run) { runner.converge(described_recipe) }
let(:node) { runner.node }
# Test whether directory is created with specifed attributes
# Node attributes are necessary to satisfy logic of parent recipe
it 'creates a directory with root ownership and permissions' do
node.automatic['fqdn'] = 'ceph-1'
node.set['ceph']['hosts']['ceph-1']
node.set['ceph']['hosts']['ceph-1']['osd_devices'] = [{device: "/ceph-1-osd", journal: "/ceph-1-journal/journal", type: "directory"}]
expect(chef_run).to create_directory("#{osd_device}").with(
user: 'root',
group: 'root',
)
end
it 'executes ceph-disk-prepare and ceph-disk-activate' do
node.automatic['fqdn'] = 'ceph-1'
node.set['ceph']['hosts']['ceph-1']
node.set['ceph']['hosts']['ceph-1']['osd_devices'] = [{device: "/ceph-1-osd", journal: "/ceph-1-journal/journal", type: "directory"}]
expect(chef_run).to run_execute("ceph-disk-prepare on #{osd_device}")
expect(chef_run).to run_execute("ceph-disk-activate #{osd_device}")
end
end
這chefspec測試通過沒有問題:
.....
Finished in 4.99 seconds (files took 8.13 seconds to load)
5 examples, 0 failures
Coverage report generated for RSpec to /Users/joe.bloggs/workspace/cookbook_ceph/build/report/coverage/coverage.xml
不過,我想設置 'node.automatic' 和「node.set '陳述只有一次(在測試之外),然後在隨後的測試中重用它們。
我的努力,以「全球」設置這些屬性看起來是這樣的:
# encoding: UTF-8
require_relative '../spec_helper'
osd_device = '/ceph-1-osd'
describe 'ceph::per-host-osd' do
let(:chef_run) do
ChefSpec::Runner.new do |node|
node.automatic['fqdn'] = 'ceph-1'
node.set['ceph']['hosts']['ceph-1']
node.set['ceph']['hosts']['ceph-1']['osd_devices'] = [{device: "/ceph-1-osd", journal: "/ceph-1-journal/journal", type: "directory"}]
end
end
# Test whether directory is created with specifed attributes
# Node attributes are necessary to satisfy logic of parent recipe
it 'creates a directory with root ownership and permissions' do
expect(chef_run).to create_directory("#{osd_device}").with(
user: 'root',
group: 'root',
)
end
it 'executes ceph-disk-prepare and ceph-disk-activate' do
expect(chef_run).to run_execute("ceph-disk-prepare on #{osd_device}")
expect(chef_run).to run_execute("ceph-disk-activate #{osd_device}")
end
end
它返回以下錯誤:
...FF
Failures:
1) ceph::per-host-osd creates a directory with root ownership and permissions
Failure/Error: expect(chef_run).to create_directory("#{osd_device}").with(
NoMethodError:
undefined method `resource_collection' for nil:NilClass
# ./spec/unit/per-host-osd_spec.rb:17:in `block (2 levels) in <top (required)>'
2) ceph::per-host-osd executes ceph-disk-prepare and ceph-disk-activate
Failure/Error: expect(chef_run).to run_execute("ceph-disk-prepare on #{osd_device}")
NoMethodError:
undefined method `resource_collection' for nil:NilClass
# ./spec/unit/per-host-osd_spec.rb:23:in `block (2 levels) in <top (required)>'
Finished in 3.12 seconds (files took 8.46 seconds to load)
5 examples, 2 failures
Failed examples:
rspec ./spec/unit/per-host-osd_spec.rb:16 # ceph::per-host-osd creates a directory with root ownership and permissions
rspec ./spec/unit/per-host-osd_spec.rb:22 # ceph::per-host-osd executes ceph-disk-prepare and ceph-disk-activate
Coverage report generated for RSpec to /Users/joe.bloggs/workspace/cookbook_ceph/build/report/coverage/coverage.xml
我是新來chefspec,所以也許我失蹤一些東西。任何幫助是極大的讚賞。謝謝。
確實是這個問題。我嘗試了你的建議,它的工作。非常感謝。 – mickm