Почему Pester говорит, что эта функция вызывалась 0 раз, но я могу подтвердить, что она вызывалась при запуске скрипта?

#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'}
}