ruby - ChefSpec 和 Ark 资源测试

标签 ruby chef-infra chef-solo cookbook chefspec

我开始使用 Chefspec 进行测试,我认为这是一个非常简单可靠的测试框架。但我在方舟资源测试方面遇到了一些问题。 我有这个 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

我想要对我的 Recipe 进行哪些测试 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>错误

在实际实践中,它会做它需要做的事情,但我被要求开始对我所有的 Recipe 进行测试,所以我决定从我的 df-maven Recipe 开始。

无论如何,我想我必须定义匹配器,但我不明白如何去做并使我的测试通过。

最佳答案

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

然后在您的 spec_helper.rb 中要求“spec/support/something”。

这将生成一个put_ark 资源匹配器/

关于ruby - ChefSpec 和 Ark 资源测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24173885/

相关文章:

ruby - Linux 服务器上 ruby​​ 项目的持续集成设置

ruby - 如何在 Middleman 中启用 Debug模式以便查看额外的日志输出?

java - Chef-run windows 意外的输入结束,期待keyword_end

ruby - Vagrant 默认使用 Ruby 1.9.3

chef-infra - 如何在 .kitchen.yml 文件中为 chef_solo provisioner 指定 Recipe 路径?

javascript - 如何从 Rails 应用程序中的 assets/images 文件夹中获取图像

ruby - 如何等待 Selenium 中的页面重定向?

java - 使用 Vagrant 时为 Chef 预缓存下载

docker - 我们如何使用 Chef Recipe 登录到 docker hub(私有(private)注册表)?

ruby - 无法通过SSH运行Chef-solo命令