#powershell #invoke-command #pester
#powershell #invoke-command #pester
Вопрос:
В моем сценарии powershell я проверяю удаленный компьютер, чтобы узнать, является ли он виртуальной машиной или физической. Если это виртуальная машина, я вызываю пользовательскую функцию для восстановления моментального снимка виртуальной машины, если не виртуальная, я пропускаю ее. Я протестировал скрипт, и он работает, но Pester говорит, что функция восстановления виртуальной машины никогда не вызывается. Ищу любую помощь, которую я могу получить.
Скрипт:
foreach ($VMServer in $VMpool) {
$serverType = (Invoke-RemoteServer -Server $VMServer -Username $VMPoolUsername -Password $VMPoolPassword -WithoutConfigurationName -ScriptBlock {Get-CimInstance win32_computersystem}).Model
if ($serverType -eq "Virtual Machine") {
Write-Output " -Restore $BaseSnapShotForTesting snapshot on $VMServer"
Restore-CineVMSnapshot -CheckpointName $BaseSnapShotForTesting -VMServer $VMServer -HostVMServer $HostVMServer `
-Username $HostVMServerUsername -Password $HostVMServerPassword
} else {
Write-Output " *$VMServer is NOT a Virtual Machine. Skipping Restore*"
}
}
Тест:
foreach ($testVM in $testVMPool) {
Mock Invoke-RemoteServer {return $true}
Assert-MockCalled Restore-CineVMSnapshot 1 -ParameterFilter {
$CheckpointName -and
$VMServer -eq $testVM -and
$HostVMServer -and
$Username -and
$Password
} -Scope It
}
}
Комментарии:
1. Я думаю, вам нужно
Mock Invoke-RemoteServer {return @{Model='Virtual Machine'}}
. Где вы издеваетесьRestore-CineVMSnapshot
?2. Святое дерьмо, это сработало!! Спасибо, Матиас
Ответ №1:
Глядя на if
инструкцию в вашем скрипте, Invoke-RemoteServer
должен быть возвращен хотя бы один объект со Model
свойством, значение которого равно "Virtual Machine"
, чтобы ожидаемая ветвь выполнялась.
Попробуйте изменить издевательское определение:
Mock Invoke-RemoteServer {
return @{Model = 'Virtual Machine'}
}