Я уже некоторое время использую Pester для написания (простых) тестов для наших сценариев PowerShell, но, естественно, чем дальше, тем сложнее становятся сценарии. Я не разработчик (просто QA автоматизации) и, следовательно, не могу начать вносить изменения в существующий код, но мне нужно написать для них модульные тесты.
В следующем скрипте я сталкиваюсь с 2 проблемы:
Функция запускается запуском другого файла .ps1 с помощью оператора вызова. Этот другой сценарий может быть запущен только как администратор и выполняет некоторые проверки перед развертыванием. Теперь я не хочу тестировать этот внешний скрипт модульно, поэтому мне нужен способ смоделировать или обойти вызов & $ PSScriptRoot \ PreReqCheck.ps1. Я подумал, просто издеваться, что это было бы неплохо, но & зарезервировано для будущего использования, и я советую заключить его в кавычки в строку, что на самом деле не работает.
Второй (но я думаю, что это может быть Легче решить) следующее:
После запуска PreReqCheck определенные переменные будут заполнены ($ computerName, $ masterNodes, $ dataNodes) и продолжены оператором If / Elseif / Elseif, который в зависимости от набора переменных , получает и запускает сервис. Как этот кусок кода:
If ($computerName = "X")
{
$masterNodes = @("1","2","3")
$dataNodes = @("01","02","03")
}
Elseif ($computerName = "Y")
{
$masterNodes = @("1","2","3")
$dataNodes = @("01","02","03")
}
Elseif ($computerName = "Z")
{
$masterNodes = @("1","2","3")
$dataNodes = @("01","02","03")
}
forEach ($masterNode in $masterNodes)
{
Does something
}
forEach ($dataNode in $dataNodes)
{
Does something
}
Мой вопрос по этому поводу. Как лучше всего создать тест, в котором я могу указать, какие переменные использовать? Я пробовал что-то вроде этого:
Describe "ReconfigureMainCluster" {
Context "test" {
Mock Set-Service
Mock Get-service
#Mock Write-Host
Mock Start-Service
$computerName = "X"
It "checks something" {
ReconfigureMainCluster
Assert-MockCalled 'Set-Service' -Exactly 12
Assert-MockCalled 'Write-Host' -Exactly 22
Assert-MockCalled 'Get-Service' -Exactly 6
}
It "checks computername"{
$computerName | Should be "X"
}
}
}
Это проходит, но когда я пишу аналогичный тест для computerName Y, переменная $ computerName остается X (я могу видеть это из-за комментирования Mock Write-Host, и один и тот же текст указывается дважды.
Я думаю, мне нужно будет где-то определить переменные, но не уверен, где и как ...