ChefSpec测试目录存在

时间:2019-01-21 21:41:51

标签: chef chefspec

我正在尝试编写ChefSpec测试以检查配方是否仅在目录不存在的情况下创建了目录。我通过了“创建目录”的第一个测试,但第二个测试失败了。食谱如下。有人可以帮忙完成第二部分吗?因为如果目录存在,则第一次测试将失败。我必须删除目录才能进行第一次测试,然后第二次测试仍然失败。

require 'spec_helper'

describe 'my_cookbook::default' do
  context 'Windows 2012' do
    let(:chef_run) do
      runner = ChefSpec::ServerRunner.new(platform: 'Windows', version: '2012')
      runner.converge(described_recipe)
    end

    it 'converges successfully' do
      expect { chef_run }.to_not raise_error
    end

    it 'creates directory' do
      expect(chef_run).to create_directory('D:\test1\logs')
    end

    it 'checks directory' do
      expect(chef_run).to_not create_directory( ::Dir.exists?("D:\\test1\\logs") )
    end
  end
end

这是食谱,它可以按预期工作,但我似乎无法围绕它编写测试。

directory "D:\\test1\\logs" do
  recursive true
  action :create
  not_if { ::Dir.exists?("D:\\test1\\logs") }
end

1 个答案:

答案 0 :(得分:0)

not_ifonly_if是厨师guards

  

然后使用保护属性来告知厨师客户端是否应继续执行资源

为了用directory resource测试您的chefspec,您将必须使用保护措施,以便在Chefspec编译您的资源时,您希望not_if保护措施的评估结果为true或false。

  

为了让ChefSpec知道如何评估资源,我们需要告诉它如果该命令在实际计算机上运行,​​该命令将如何返回此测试:

describe 'something' do
  recipe do
    execute '/opt/myapp/install.sh' do
      # Check if myapp is installed and runnable.
      not_if 'myapp --version'
    end
  end

  before do
    # Tell ChefSpec the command would have succeeded.
    stub_command('myapp --version').and_return(true)
    # Tell ChefSpec the command would have failed.
    stub_command('myapp --version').and_return(false)
    # You can also use a regexp to stub multiple commands at once.
    stub_command(/^myapp/).and_return(false)
  end
end