Пестер не проходит тест, даже когда исключение поймано - PullRequest
0 голосов
/ 17 мая 2018

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

Этот код воспроизводит проблему:

function Test-FSPath {

    [cmdletbinding()]
    param([string]$FileSystemPath)

    if([string]::IsNullOrWhiteSpace($FileSystemPath)) { return $false }

    $result = $false
    try {  
        if(Test-Path $FileSystemPath) {
            Write-Debug "Verifying that $FileSystemPath is a file system path"
            $item = Get-Item $FileSystemPath -ErrorAction Ignore
            $result = ($item -ne $null) -and $($item.PSProvider.Name -eq 'FileSystem')        
        }
    } catch {
        # Path pattern that Test-Path / Get-Item can't handle 
        Write-Debug "Ignoring exception $($_.Exception.Message)" 
    }

    return ($result -or ([System.IO.Directory]::Exists($FileSystemPath)) -or ([System.IO.File]::Exists($FileSystemPath)))
}

Describe 'Test' {
    Context Test-FSPath { 
        It 'returns true for a path not supported by PowerShell Test-Path' {
            $absPath = "$env:TEMP\temp-file[weird-chars.txt"
            [System.IO.File]::WriteAllText($absPath, 'Hello world')
            $result = Test-FSPath $absPath -Debug
            $result | Should -Be $true 
            Write-Host "`$result = $result"
            Remove-Item $absPath
        } 
    }
}

Ожидаемый результат: тесты пройдены

Фактический результат: тест не пройден:

[-] returns true for a path not supported by PowerShell Test-Path 2.62s
  WildcardPatternException: The specified wildcard character pattern is not valid: temp-file[weird-chars.txt
  ParameterBindingException: Cannot retrieve the dynamic parameters for the cmdlet. The specified wildcard character pattern is not valid: temp-file[weird-chars.txt

1 Ответ

0 голосов
/ 17 мая 2018

Исключение, которое вы видите, исходит не от вашей функции, а от использования Remove-Item, которое выдает ошибку, пытаясь удалить ошибочный путь (который также не существует).Вы должны просто удалить его, так как вы никогда не ожидаете, что элемент все равно будет создан.

Или, альтернативно (как упомянуто в комментариях), используйте TestDrive: который вам тогда не нужно беспокоиться об очистке (кажется, дляпуть, который нужно поддерживать, вы должны использовать $Testdrive).

    It 'returns true for a path not supported by PowerShell Test-Path' {
        $absPath = "$env:TEMP\temp-file[weird-chars.txt"
        [System.IO.File]::WriteAllText($absPath, 'Hello world')
        $result = Test-FSPath $absPath
        $result | Should -Be $true 
    } 

В качестве отступления я обычно склонен делать вещи типа выполнения вне It и просто проверять результат внутри.Когда я начал делать это для вашего кода, он показал, что тест проходит успешно, поскольку ошибка переместилась в блок Context.Вот что я имею в виду (также в этом примере используется TestDrive: через переменную $testdrive):

Describe 'Test' {
    Context Test-FSPath { 
        $absPath = "$testdrive\temp-file[weird-chars.txt"
        [System.IO.File]::WriteAllText($absPath, 'Hello world')
        $result = Test-FSPath $absPath

        It 'returns true for a path not supported by PowerShell Test-Path' {
            $result | Should -Be $true 
        } 
    }
}
...