在规范测试中存根 chef_environment 变量

Stubbing chef_environment variable in spec tests

在我的规范测试中 chef_env 变量出现问题。部分食谱:

recipe.rb

example_credentials = data_bag_item(:credentials, 'example')

    template '/etc/nginx/sites-available/example.conf' do
      source 'http/example.conf.erb'
      owner 'root'
      group 'root'
      mode '0644'
      variables({
        authorization: Base64.strict_encode64(example_credentials[node.chef_environment]['example_auth']),
        cluster_id: node['project']['http']['example']['cluster_id']
      })

end

测试一下:

test.rb

require 'spec_helper'

    describe 'project::http' do
      let(:chef_run) do
        ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '16.04') do |node|
          env = Chef::Environment.new
          env.name 'test'
          expect(node).to receive(:chef_environment).and_return env.name
          expect(Chef::Environment).to receive(:load).and_return env
          end.converge(described_recipe)
        end
    
    
      before(:each) do
        stub_data_bag_item(:credentials, 'example').and_return(example_auth: 'test_value')
      end
end

但是我仍然遇到错误。

   expected no Exception, got #<NoMethodError: undefined method `[]' for nil:NilClass> with backtrace

当您尝试访问您的哈希嵌套属性,但没有您正在寻找的父属性时,经常会出现此错误。

在你的例子中,你存根凭证数据包并且它returns一个散列:

{
  example_auth: 'test_value'
}

然后在这一行:

authorization: Base64.strict_encode64(example_credentials[node.chef_environment]['example_auth']),

您正在尝试访问哈希的“测试”键 (= node.chef_environment),但它不存在。你需要改变你存根的数据包,所以它也有“测试”键。

stub_data_bag_item(:credentials, 'example').and_return(
  {
    'test' => {
      'example_auth' => 'test_value'
    }
  }
)