ChefSpec和Ark资源测试

时间:2014-06-11 22:50:33

标签: ruby chef chef-solo cookbook chefspec

我开始使用chefspec进行测试,我认为这是一个非常简单可靠的测试框架。但我在ark资源测试方面遇到了一些问题。 我有这个default_spec.rb

require 'chefspec'
require_relative 'spec_helper'

describe 'df-maven::default' do
  let (:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
  it 'should run ark' do
    expect(chef_run).to put_ark #'described_'
  end
end

我想要的食谱df-maven::default

include_recipe 'java::default'
include_recipe 'ark::default'

mvn_version = node['df-maven']['version'].to_s

ark 'maven' do
  url      node['df-maven'][mvn_version]['url']
  checksum node['df-maven'][mvn_version]['checksum']
  path     node['df-maven']['m2_home']
  version  node['df-maven'][mvn_version]['version']
  has_binaries ['bin/mvn']
  append_env_path true
  action :put
end

但是当我运行测试时,我收到错误undefined local variable or method 'put_ark'

然后我将其添加到我的spec_helper中(因为我认为匹配器应该这样做):

require 'chefspec'

module ChefSpec
  module Matchers
    RSpec::Matchers.define :put_ark do |package_name|
      match do |chef_run|
        chef_run.resources.any? do |resource|
          resource_type(resource) == 'ark' and resource.name == package_name
        end
      end
    end
  end
end

但我收到undefined method resources' for #<ChefSpec::Runner:0x40a2650>错误

在实际操作中,它按照要求做了,但我被要求开始为我的所有食谱进行测试,所以我决定从我的df-maven食谱开始。

无论如何,我认为我必须定义匹配器,但我不明白该怎么做并让我的测试通过。

1 个答案:

答案 0 :(得分:3)

ChefSpec README中所述,libraries/matchers.rb(自动加载):

if defined?(ChefSpec)
  def put_ark(resource_name)
    ChefSpec::Matchers::ResourceMatcher.new(:ark, :put, resource_name)
  end
end

如果您不想发布此匹配器,可以将其放入spec/support/something.rb

def put_ark(resource_name)
  ChefSpec::Matchers::ResourceMatcher.new(:ark, :put, resource_name)
end

然后要求&#39; spec / support / something&#39;在spec_helper.rb

这将生成put_ark资源匹配器/