2017-02-14 29 views
0

Я пытаюсь написать chefspec/unit test для моего рецепта. Я столкнулся с проблемой. Мне нужно написать блок-тест для кода ниже. Если я прокомментирую последний оператор моего кода, тест выполняется успешно, но я должен уловить это утверждение и его надлежащий способ записи. Спасибо за помощь.Как я могу проверить chefspec/unit test для следующего кода моего рецепта

powershell_script 'Delete ISO from temp directory' do 
    code <<-EOH 
      [System.IO.File]::Delete("#{iso_path}") 
      [System.IO.File]::Delete("#{config_path}") 
      EOH 
    guard_interpreter :powershell_script 
    only_if { File.exists?(iso_path)} 
end 
+1

Как я понимаю, вы пытаетесь удалить некоторые файлы. У шеф-повара есть ресурс 'file' для этого, вам не нужна powershell. –

+0

@DracoAter Я хочу удалить ISO из временного каталога, только если он существует. Я использовал ресурс powershell для модульного тестирования этого блока, и он отлично работает, но я тоже должен усвоить это условие, чтобы правильно написать единичный тест. –

+0

Это именно то, что делает ресурс 'file'. Он удаляет файл, если файл существует. Вы всегда должны отдавать предпочтение существующим идемпотентным ресурсам (например, файлу, каталогу, шаблону) не-идемпотентным (например, execute, bash, powershell_script). –

ответ

0

Итак, для начала ваш код не имеет смысла. У вас есть набор guard_interpreter, но ваше предложение guard является блоком кода Ruby, а не командной строкой. Кроме этого, просто проверьте его, как и все остальное. Если вы имеете в виду конкретно, как тестировать как существующий, так и не существующий файл, вы должны использовать rspec-mocks для настройки File.exists?, чтобы вернуть законченное значение.

0

Прежде всего. Если вам нужно только удалить файл, и в соответствии с кодом, который имеет место, вы должны использовать ресурс file.

[iso_path, config_path].each do |path| 
    file path do 
    action :delete 
    end 
end 

File - идемпотентный ресурс. Что означает, что Chef проверяет вас, если ресурс должен быть изменен. В этом случае Chef удалит файл, только если он существует.

Powershell_script (и все остальные ресурсы script) не являются идемпотентными. Это означает, что вы проверили себя, если ресурс должен быть выполнен, предоставив guard. Охрана only_if или not_if блок. Вы должны удалить строку guard_interpreter :powershell_script, потому что вы на самом деле пишете рубин в охраннике.

powershell_script 'Delete ISO from temp directory' do 
    code <<-EOH 
    [System.IO.File]::Delete("#{iso_path}") 
    [System.IO.File]::Delete("#{config_path}") 
    EOH 
    only_if { File.exists?(iso_path) } 
end 

Теперь на тестирование. Тестирование file Ресурс прост, так как я понимаю, вы уже можете это сделать. Но тестирование powershell_script сложнее: вы должны заглушить звонок File.exists?(iso_path). Вы можете сделать это так:

describe 'cookbook::recipe' do 
    context 'with iso file' do 
    let! :subject do 
     expect(::File).to receive(:exists?).with('<iso_path_variable_value>').and_return true 
     allow(::File).to receive(:exists?).and_call_original 
     ChefSpec::Runner.new(platform: 'windows', version: '2008R2').converge described_recipe 
    end 

    it { shold run_powershell_script 'Delete ISO from temp directory' } 
    end 

    context 'without iso file' do 
    let! :subject do 
     expect(::File).to receive(:exists?).with('<iso_path_variable_value>').and_return false 
     allow(::File).to receive(:exists?).and_call_original 
     ChefSpec::Runner.new(platform: 'windows', version: '2008R2').converge described_recipe 
    end 

    it { shold_not run_powershell_script 'Delete ISO from temp directory' } 
    end 
end 

Вы видите, насколько больше работы вы должны сделать сравнение с тестированием file ресурса?