Chefspec не повторяет массив
У меня есть рецепт для установки компонентов для IIS. Так как есть много, это массив, который подается в windows_feature
установить блок. Вот так:
strings.each do |st|
windows_feature st do
guard_interpreter :powershell_script
not_if "$ret = Get-WindowsOptionalFeature -Online -FeatureName #{st}; if ($ret.State -eq 'Disabled' ) { return 'false'} else {return 'true'}"
action :install
end
end
Мой связанный блок Chefspec содержит тот же поток содержимого массива. Блок такой:
describe 'HEQIIS::IIS' do
let(:chef_run) { ChefSpec::SoloRunner.converge('HEQIIS::IIS') }
strings.each do |st|
it "installs_#{st}" do
stub_command("$ret = Get-WindowsOptionalFeature -Online -FeatureName #{st}; if ($ret.State -eq 'Disabled' ) { return 'false'} else {return 'true'}").and_return(false)
expect(chef_run).to install_windows_feature("#{st}")
end
end
end
Когда я запускаю Chefspec в кулинарной книге, я получаю сообщение об ошибке:
HEQIIS::IIS installs_IIS-LegacyScripts
Failure/Error: let(:chef_run) { ChefSpec::SoloRunner.converge('HEQIIS::IIS') }
ChefSpec::Error::CommandNotStubbed:
Executing a real command is disabled. Unregistered command:
command("$ret = Get-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole; if ($ret.State -eq 'Disabled' ) { return 'false'} else {return 'true'}")
You can stub this command with:
stub_command("$ret = Get-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole; if ($ret.State -eq 'Disabled' ) { return 'false'} else {return 'true'}").and_return(...)
# ./heqiis/spec/default_spec.rb:70:in `block (2 levels) in <top (required)>'
# ./heqiis/spec/default_spec.rb:75:in `block (3 levels) in <top (required)>'
В ошибке, где он отображает -Featurename как "WebServerRole", он делает это для каждой строки (30 записей). Указывает, что на этом этапе выполняется только перебор первого элемента. В сочетании с тем фактом, что я определенно использую блок stub_command, я не совсем уверен, почему он дает ошибку. У кого-нибудь есть мысли?
1 ответ
В вашей спецификации ваш шеф-повар сходится в блоке let. Перемещает ли stub_command()
призывает быть в before do ... end
заблокировать помощь?
РЕДАКТИРОВАТЬ: действительно, ваш файл рецепта устанавливает команды всего массива, которые должны быть заглушки для каждого из вызовов spec (). Добавление второго цикла внутри блока before для заглушки всех команд решит вашу проблему.