Chefspec 在尝试安装多个 window 功能时不起作用
Chefspec not working when trying to install multiple window feature
我有一个安装 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 块这一事实,我不太确定为什么会出错。有人有什么想法吗?
在您的规范中,您的厨师 运行 正在 let 块中收敛。将您的 stub_command()
调用移动到 before do ... end
块中有帮助吗?
编辑:事实上,您的配方文件正在设置整个数组的命令价值,这些命令需要为每个规范的 expect() 调用存根。在 before 块内添加第二个循环以清除所有命令将解决您的问题。
我有一个安装 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 块这一事实,我不太确定为什么会出错。有人有什么想法吗?
在您的规范中,您的厨师 运行 正在 let 块中收敛。将您的 stub_command()
调用移动到 before do ... end
块中有帮助吗?
编辑:事实上,您的配方文件正在设置整个数组的命令价值,这些命令需要为每个规范的 expect() 调用存根。在 before 块内添加第二个循环以清除所有命令将解决您的问题。