2015-07-21 33 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

相关问题