Пестер не проходит тест, даже если обнаружено исключение

У меня есть служебная функция, которая специально обрабатывает исключение и игнорирует его, но при тестировании с помощью 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

person Joshua Honig    schedule 17.05.2018    source источник
comment
Test-Path не должен выдавать никаких ошибок, если вы этого не скажете. Вы не выбрасываете никаких исключений, которые могут быть пойманы, и специально игнорируете действия, которые могут. Добавить -ErrorAction Stop в Test-Path   -  person Maximilian Burszley    schedule 17.05.2018
comment
Также ознакомьтесь с TestDrive Пестера:   -  person Maximilian Burszley    schedule 17.05.2018
comment
Если вы измените имя файла (например, remove [), все будет отлично!   -  person Victor Silva    schedule 17.05.2018
comment
@VictorSilva Это упускает из виду суть теста. Квадратная скобка - это допустимый путь к файлу Windows, который Test-Path не может обработать. Функция Test-FSPath предназначена для решения этой проблемы.   -  person Joshua Honig    schedule 17.05.2018


Ответы (1)


Исключение, которое вы видите, исходит не от вашей функции, а от использования 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 
        } 
    }
}
person Mark Wragg    schedule 17.05.2018