如何在 chefspec 中初始化需要在食谱中使用的变量

How to initialize variables in chefspec which is needed to be used in recipe

我有下面的食谱模板资源块:

 os_ver = node['platform_version'].to_f
 REPO_TEMPLATE = ''
 if (os_ver >= 6) && (os_ver < 7)
   REPO_TEMPLATE = 'epel.repo.rhel6.erb'
 elsif (os_ver >= 7) && (os_ver < 8)
   REPO_TEMPLATE = 'epel.repo.rhel7.erb'
 end

 template EPEL_REPO_FILE do
   source REPO_TEMPLATE
   owner 'root'
   group 'root'
   mode '0644'
   action :create
 end

然后我像这样制作了单元测试 chefspec:

describe 'cos::upgrade_rpms' do
  let(:chef_run) do
    ChefSpec::SoloRunner.new do |node|
      node.set['platform_version'] = '7.0'
      REPO_TEMPLATE = 'epel.repo.rhel7.erb'
    end.converge(described_recipe)
  end
  it 'creates a epel repo' do
    expect(chef_run).to create_template('/etc/yum.repos.d/epel.repo').with(
      source: 'epel.repo.rhel7.erb'
      owner: 'root',
      group: 'root',
      mode: '0644'
    )
end

单元测试将失败,表示:源是 '' 而不是源:'epel.repo.rhel7.erb'。 test中设置的REPO_TEMPLATE好像没有效果。有人能告诉我如何模拟单元测试中的值吗?

platform_version 是一个自动属性,通常由 fauxhai 填写 os 和您在 runner 或全局 Rspec 配置中提供的版本,如下所示(引用自 ChefSpec 的自述文件并根据您的用例进行调整):

RSpec.configure do |config|
  # Specify the operating platform to mock Ohai data from (default: nil)
  config.platform = 'redhat'

  # Specify the operating version to mock Ohai data from (default: nil)
  config.version = '7.0'
end

引自ChefSpec Documentation,用于在运行时修改自动属性:

describe 'example::default' do
  let(:chef_run) do
    ChefSpec::SoloRunner.new do |node|
      node.automatic['memory']['total'] = '512kB'
    end.converge(described_recipe)
  end
end