Каталог тестирования ChefSpec существует - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь написать тест 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 голосов
/ 24 января 2019

not_if или only_if являются шеф-поваром охранниками :

затем используется свойство защиты, чтобы сообщить клиенту-шефу, следует ли ему продолжать выполнение ресурса

для того, чтобы протестировать свой directory ресурс с chefspec , вам придется заглушить охрану, поэтому, когда chefspec скомпилирует ваши ресурсы, вы захотите not_ifGuard оценивает как 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
...