Пестер не улавливает выданную ошибку

Когда я запускаю следующий тест на приставку, я ожидаю, что он обнаружит ожидаемую ошибку, но это не так. Но когда я запускаю тест с другой функцией с другим оператором throw, он работает.

Тест на приставание:

Describe "Remove-GenericCredential Function Tests" {
  $InternetOrNetworkAddress = 'https://[email protected]'

  Context "Test:  Remove-GenericCredential -InternetOrNetworkAddress '$InternetOrNetworkAddress' (Credential does not exist)" {
  It "This Command threw an error.  The credential does not exist." { { (Remove-GenericCredential -InternetOrNetworkAddress $InternetOrNetworkAddress -Confirm:$false) } | should throw "Remove-GenericCredential : Credential $InternetOrNetworkAddress not found" }
  }
}

Ошибка, которая не обнаружена:

Remove-GenericCredential : Credential https://[email protected] not found

At C:\Users\klocke7\Documents\WindowsPowerShell\Modules\Ford_CredentialManager\Tests\Remove-GenericCredential.Tests.ps1:30 char:76
+ ... xist." { { (Remove-GenericCredential -InternetOrNetworkAddress $Inter ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Remove-GenericCredential

      [-] This Command threw an error.  The credential does not exist. 44ms
        Expected: the expression to throw an exception with message {Remove-GenericCredential : Credential https://[email protected] not found}, an exception was not raised, message was {}
            from C:\Users\klocke7\Documents\WindowsPowerShell\Modules\Ford_CredentialManager\Tests\New-GitHubCredential.Tests.ps1:59 char:176
            + ... e $UserName -Token 'NotAGitHubTokenSpecialCharacters!@#$%^&*') } | sh ...
            +                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        at <ScriptBlock>, C:\Users\klocke7\Documents\WindowsPowerShell\Modules\Ford_CredentialManager\Tests\Remove-GenericCredential.Tests.ps1: line 30
        30:     It "This Command threw an error.  The credential does not exist." { { (Remove-GenericCredential -InternetOrNetworkAddress $InternetOrNetworkAddress -Confirm:$false) } | should throw 'Remove-GenericCredential : Credential https://[email protected] not found' }

person Keith    schedule 08.03.2018    source источник
comment
Вы можете показать нам Remove-GenericCredential или хотя бы код, который выдает исходную ошибку?   -  person Mathias R. Jessen    schedule 08.03.2018
comment
Ошибка записи -Учетные данные сообщения $ InternetOrNetworkAddress не найдены -Category ObjectNotFound   -  person Keith    schedule 08.03.2018
comment
Разве это не должно быть .... | Should -Throw, а не .... | Should Throw? И после throw должна следовать строка, используемая в вашем операторе throw, например, {throw mud} | Надо -брызгать грязью прошло бы. В противном случае дважды проверьте, что, по вашему мнению, делает функция, что она делает.   -  person Adam    schedule 09.03.2018
comment
Should Throw и Should -Throw вызывают одну и ту же ошибку. И моя строка выброса, похоже, идентична строке, которая создается оператором ошибки записи.   -  person Keith    schedule 09.03.2018


Ответы (2)


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

Есть два способа решить эту проблему:

  1. Вы можете изменить его так, чтобы он выдавал прерывающую ошибку, изменив свой Write-Error на Throw.
  2. Вы можете изменить тест, чтобы заставить функцию выдавать завершающую ошибку, даже если не завершаются ошибки, используя -ErrorAction Stop при ее вызове (я вижу, что вы используете -Confirm, я предполагаю, что вы использовали [cmdletbinding()] в функции, чтобы добавить общие параметры, такие как -ErrorAction).

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

Function Remove-GenericCredential {
    [cmdletbinding(supportsshouldprocess)]
    Param(
        $InternetOrNetworkAddress
    )

    Write-Error "Remove-GenericCredential : Credential $InternetOrNetworkAddress not found"
}

Describe "Remove-GenericCredential Function Tests" {
    $InternetOrNetworkAddress = 'https://[email protected]'

    Context "Test:  Remove-GenericCredential -InternetOrNetworkAddress '$InternetOrNetworkAddress' (Credential does not exist)" {
    It "This Command threw an error.  The credential does not exist." { 
        { (Remove-GenericCredential -InternetOrNetworkAddress $InternetOrNetworkAddress -Confirm:$false -ErrorAction Stop) } | should throw "Remove-GenericCredential : Credential $InternetOrNetworkAddress not found" }
    }
}

От help Write-Error:

Командлет Write-Error объявляет непрекращающуюся ошибку. По умолчанию ошибки отправляются в потоке ошибок главной программе для отображения вместе с выводом.

Чтобы записать непрерывную ошибку, введите строку сообщения об ошибке, объект ErrorRecord или объект Exception. Используйте другие параметры Write-Error, чтобы заполнить запись об ошибке.

Непрерывные ошибки записывают ошибку в поток ошибок, но не останавливают обработку команды. Если для одного элемента в коллекции входных элементов объявлена ​​непрекращающаяся ошибка, команда продолжает обработку других элементов в коллекции.

Чтобы объявить прерывающую ошибку, используйте ключевое слово Throw. Для получения дополнительной информации см. About_Throw (http://go.microsoft.com/fwlink/?LinkID=145153).

person Mark Wragg    schedule 26.03.2018

Вероятно, это связано с тем, что командлет выдает непрекращающуюся ошибку, поскольку Pester заявляет только против завершающих ошибок. В этом случае необходимо переписать тест следующим образом (используя старый синатакс Pester v3 согласно вашему примеру):

It "Test a non-terminating error gets thrown" {
  $errorThrown = $false;
  try
  {
    Invoke-CmdletThatThrowsNonTerminatingError -ErrorAction Stop
  }
  catch
  {
    $errorThrown = $true
  }
  $errorThrown | Should Be $true
}

В блоке catch вы также можете получить подробную информацию об исключении, такую ​​как сообщение или тип исключения в $_ ob

person bergmeister    schedule 25.03.2018