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