Есть ли способ проверить / утвердить вывод из Write-Host с помощью Pester? - PullRequest
1 голос
/ 03 марта 2020

Я пишу тесты для довольно сложного сценария, и в сценарии есть одна особая функция, которая будет выводить пользователю различные серии сообщений журнала. Я хотел бы подтвердить, отображается ли конкретное сообщение журнала.

Основная проблема заключается в том, что я не знаю, какой параметр неявно обрабатывает текст, который я передаю командлету Write-Host.

Вот некоторый код, который отражает предпосылку того, что я пытаюсь сделать ...

Функция для проверки

function TestFunction($TestInput) {
    if ($TestInput -contains 1) {
        Write-Host "TestInput contains a 1"
    }

    if ($TestInput -contains 3 ) {
        Write-Host "TestInput contains a 3"
    }

    if ($TestInput -contains 4 ) {
        Write-Host "TestInput contains a 4"
    }
}

Тест Пестера

Describe "TestFunction" {
    It "should call Write-Host with appropriate message if 1 or 3 is passed" {
        Mock Write-Host {}
        TestFunction -TestInput @(1, 2, 3)
        Assert-MockCalled Write-Host -Exactly 2 -Scope It
        Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { "TestInput contains a 1" }
        Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { "TestInput contains a 3" }
    }
}

Вывод

  Describing TestFunction
    [-] should call Write-Host with appropriate message if 1 or 3 is passed 19ms
      at <ScriptBlock>, : line 235
      235:         Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { "TestInput contains a 1" }
      Expected Write-Host to be called 1 times exactly but was called 2 times
Tests completed in 106ms
Tests Passed: 0, Failed: 1, Skipped: 0, Pending: 0, Inconclusive: 0 

1 Ответ

3 голосов
/ 03 марта 2020

После просмотра документации Microsoft для командлета Write-Host я обнаружил, что есть параметр -Object. Это принимает массив обобщенных c объектов для записи в консоль. Параметр -Object - это параметр, который необходимо указать в -ParameterFilter тестов Пестера, чтобы утверждать, что отображается соответствующий текст.

Мой обновленный код выглядит следующим образом ...

Функция для проверки

function TestFunction($TestInput) {
    if ($TestInput -contains 1) {
        Write-Host "TestInput contains a 1"
    }

    if ($TestInput -contains 3 ) {
        Write-Host "TestInput contains a 3"
    }

    if ($TestInput -contains 4 ) {
        Write-Host "TestInput contains a 4"
    }
}

Проверка Пестера

Describe "TestFunction" {
    It "should call Write-Host with appropriate message if 1 or 3 is passed" {
        Mock Write-Host {}
        TestFunction -TestInput @(1, 2, 3)
        Assert-MockCalled Write-Host -Exactly 2 -Scope It
        Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { $Object -eq "TestInput contains a 1" }
        Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { $Object -eq "TestInput contains a 3" }
    }
}

Выход

  Describing TestFunction
    [+] should call Write-Host with appropriate message if 1 or 3 is passed 20ms
Tests completed in 99ms
Tests Passed: 1, Failed: 0, Skipped: 0, Pending: 0, Inconclusive: 0 
...