Прежде всего. Если вам нужно только удалить файл, и в соответствии с кодом, который имеет место, вы должны использовать ресурс 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
ресурса?
Как я понимаю, вы пытаетесь удалить некоторые файлы. У шеф-повара есть ресурс 'file' для этого, вам не нужна powershell. –
@DracoAter Я хочу удалить ISO из временного каталога, только если он существует. Я использовал ресурс powershell для модульного тестирования этого блока, и он отлично работает, но я тоже должен усвоить это условие, чтобы правильно написать единичный тест. –
Это именно то, что делает ресурс 'file'. Он удаляет файл, если файл существует. Вы всегда должны отдавать предпочтение существующим идемпотентным ресурсам (например, файлу, каталогу, шаблону) не-идемпотентным (например, execute, bash, powershell_script). –