Я использую приставание для проверки моего выброшенного исключения (отрицательные тесты).
Хотя кажется, что выброшенное сообщение об исключении точно совпадает с моим Should -Throw
, Пестер объявляет тест неудачным, когда в сообщении об исключении есть квадратные скобки. Удалив квадратные скобки из выброшенного сообщения об исключении (или заменив их другими скобками), тесты Пестера будут удовлетворять требованиям.
Следующие тесты Пестера иллюстрируют эти случаи:
Describe "Testing Pester Should Throw" {
Context "Positive tests: different brackets and one without" {
It "Test 1" {
[String]$strMyexMsg = "my text [with square brackets] 1"
{ throw $strMyexMsg } | Should -Throw $strMyexMsg
}
It "Test 2" {
[String]$strMyexMsg = "my text with * asterix"
{ throw $strMyexMsg } | Should -Throw $strMyexMsg
}
It "Test 3" {
[String]$strMyexMsg = "my text (with basic brackets)"
{ throw $strMyexMsg } | Should -Throw $strMyexMsg
}
It "Test 4" {
[String]$strMyexMsg = "my text {with curly brackets}"
{ throw $strMyexMsg } | Should -Throw $strMyexMsg
}
It "Test 5" {
[String]$strMyexMsg = "my text without brackets"
{ throw $strMyexMsg } | Should -Throw $strMyexMsg
}
}
}
Мой вопрос: почему тест 1 не проходит, а тесты 2...5 успешны?
Это вывод Pester, который я получаю:
PS D:\srcGitHpg\hpg-tools\PowerShell> Invoke-Pester .\TestPesterShouldThrow.Test.ps1
Starting discovery in 1 files.
Discovery finished in 163ms.
[-] Testing Pester Should Throw.Positive tests: different brackets and one without.Test 1 13ms (12ms|1ms)
Expected an exception, with message 'my text [with square brackets] 1' to be thrown, but the message was 'my text [with square brackets] 1'. from D:\srcGitHpg\hpg-tools\PowerShell\TestPesterShouldThrow.Test.ps1:7 char:12
+ { throw $strMyexMsg } | Should -Throw $strMyexMsg
+ ~~~~~~~~~~~~~~~~~
at { throw $strMyexMsg } | Should -Throw $strMyexMsg, D:\srcGitHpg\hpg-tools\PowerShell\TestPesterShouldThrow.Test.ps1:7
at <ScriptBlock>, D:\srcGitHpg\hpg-tools\PowerShell\TestPesterShouldThrow.Test.ps1:7
Tests completed in 389ms
Tests Passed: 4, Failed: 1, Skipped: 0 NotRun: 0
Версия PowerShell:
PS D:\srcGitHpg\hpg-tools\PowerShell> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
5 1 17763 1490
Пестер версия:
PS D:\srcGitHpg\hpg-tools\PowerShell> Get-Module -Name "Pester"
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 5.1.0 Pester {Add-ShouldOperator, AfterAll, AfterEach, Assert-MockCalled...}
Я использую командную строку Windows в Windows с версией:
Microsoft Windows [Version 10.0.17763.1577]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\System32>
Спасибо за помощь, Томми
Во время обновления Pester v5 Should -Throw
был изменен на -like
для соответствия сообщению об исключении вместо .Contains
, как это было ранее в Pester v4.
Should -Throw is using -like to match the exception message instead of .Contains.
Use * or any of the other -like wildcard to match only part of the message.
Вы можете обойти это, экранировав []
обратными кавычками `
; как показывает этот пример:
Import-Module Pester -MinimumVersion '5.0.0'
function Test-Throw {
throw "I should throw a [message]"
}
Describe 'PesterThrowBug' {
It 'Should Throw a Message' {
{ Test-Throw } | Should -Throw -ExpectedMessage 'I should throw a `[message`]'
}
}
Вот связанный выпуск Pester GitHub https://github.com/pester/Pester/issues/1793
Я не думаю, что в вашем утверждении есть что-то неправильное. Я думаю, вы наткнулись на настоящий баг. Вы должны открыть билет, чтобы они могли его посмотреть.