Ошибка chef_spec для тестирования команды curl

Я устанавливаю docker-compose через execute Ресурс в поваренной книге шеф-повара, команда execute затем уведомляет file ресурс, чтобы коснуться загруженного файла, сменить владельца на root и права на 0755

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

соответствующие ресурсы из моей кулинарной книги обертки следующие

execute 'install_docker_compose' do
    command '/usr/bin/curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose'
    user 'root'
    not_if { ::File.exist?('/usr/local/bin/docker-compose') }
    notifies :touch, 'file[docker_compose_command_file]', :immediately
end

file 'docker_compose_command_file' do
    path '/usr/local/bin/docker-compose'
    mode '0755'
    owner 'root'
    group 'root'
    notifies :create_if_missing, 'template[add_docker_compose_yml]', :immediately
end

Для модульных тестов я определяю контексты, а затем выполняю тесты для этих ресурсов следующим образом

describe 'pipeline-jumpstart-chef::default' do
    context "when the cookbook is installed it" do
        let(:chef_run) do
            runner = ChefSpec::ServerRunner.new(platform: 'ubuntu', version: '16.04')
            runner.converge(described_recipe)        
        end
        let(:execute_run) { chef_run.execute('install_docker_compose') }
        let(:docker_compose_command_file) { chef_run.file('/usr/local/bin/docker-compose') }
        let(:compose_template) { chef_run.template('add_docker_compose_yml') }

а потом тесты

    it 'installs docker compose' do
        # Mock 
        allow(File).to receive(:exists?).with(anything).and_call_original
        allow(File).to receive(:exists?).with('/usr/local/bin/docker-compose').and_return true
        # this fails
        expect(chef_run).to run_execute('install_docker_compose')
        # this passes
        expect(execute_run).to notify('file[docker_compose_command_file]').immediately
    end

    it 'makes docker-compose download exectuable command' do
        expect(chef_run).to touch_file('docker_compose_command_file').with(
            user:   'root',
            group:  'root',
            mode: '0755'
        )
    end

сообщение о сбое, как я уже сказал, не помогает понять, что пошло не так

1) pipeline-jumpstart-chef::default when the cookbook is installed it installs docker compose
    Failure/Error: expect(chef_run).to run_execute('install_docker_compose')

    expected "execute[install_docker_compose]" with action :run to be in Chef run. Other execute resources:

        execute[install_docker_compose]
        execute[start_docker_containers]

    # ./spec/unit/recipes/docker_spec.rb:50:in `block (3 levels) in <top (required)

  2) pipeline-jumpstart-chef::default when the cookbook is installed it makes docker-compose download exectuable command
 Failure/Error:
   expect(chef_run).to touch_file('docker_compose_command_file').with(
       user:   'root',
       group:  'root',
       mode: '0755'
   )

   expected "file[docker_compose_command_file]" with action :touch to be in Chef run. Other file resources:

     file[docker_compose_command_file]

 # ./spec/unit/recipes/docker_spec.rb:55:in `block (3 levels) in <top (required)>'

ссылка на исходный код всего рецепта и спецификации на GitHub

1 ответ

Второй, потому что вы попросили проверить touch_file('docker_compose_command_file'), но это не соответствует названию в рецепте (file '/usr/local/bin/docker-compose'). Первое менее очевидно, хотя, я ожидаю, что это сработает. Вам, вероятно, нужно заглушить File.exist? чтобы заставить его работать, я предполагаю, что файл существует на машине, на которой вы работаете.

Другие вопросы по тегам