2015-07-21 109 views
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,所以也許我失蹤一些東西。任何幫助是極大的讚賞。謝謝。

回答

2

在你的第二種形式中,你永遠不會收斂任何配方,所以顯然沒有resource_collection來測試。

在runner定義的末尾添加一個converge(describe_recipe)。

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.converge(described_recipe) 
end 
+0

確實是這個問題。我嘗試了你的建議,它的工作。非常感謝。 – mickm

相關問題