Search code examples
powershellmockingpester

How to properly test the ErrorVariable value of a mocked CmdLet?


We're trying to check the value in the ErrorVariable of Invoke-Command within a Pester test. But for one reason or another the -ErrorVariable is not instantiated.

Describe 'test ErrorVariable' {
    Mock Invoke-Command {
        #[CmdletBinding()]
        #param (
        #    [String[]]$ComputerName,
        #    $ScriptBlock
        #)

        $ErrorId = 'NetworkPathNotFound,PSSessionStateBroken'
        $TargetObject = 'UnknownHost'
        $ErrorCategory = [System.Management.Automation.ErrorCategory]::OpenError
        $ErrorMessage = "Connecting to remote server $TargetObject failed with the following error message : WinRM cannot process the request. The following error occurred while using Kerberos authentication: Cannot find the computer $TargetObject. Verify that the computer exists on the network and that the name provided is spelled correctly. For more information, see the about_Remote_Troubleshooting Help topic."
        $Exception = New-Object -TypeName System.InvalidOperationException -ArgumentList $ErrorMessage
        $ErrorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord -ArgumentList $Exception, $ErrorId, $ErrorCategory, $TargetObject

        $ErrorRecord
    }

    it 'should be green because it should contain the TargetObject' {
        Invoke-Command -ComputerName TestComputer -ScriptBlock {1} -ErrorVariable ConnectionError
        $ConnectionError.TargetObject | Should -Be 'UnknownHost'
    }
}

Even when adding the [CmdletBinding()] option it's still not populated. What are we missing here?


Solution

  • You should use Write-Error:

    Describe 'test ErrorVariable' {
        Mock Invoke-Command {
            $ErrorId = 'NetworkPathNotFound,PSSessionStateBroken'
            $TargetObject = 'UnknownHost'
            $ErrorCategory = [System.Management.Automation.ErrorCategory]::OpenError
            $ErrorMessage = "Connecting to remote server $TargetObject failed with the following error message : WinRM cannot process the request. The following error occurred while using Kerberos authentication: Cannot find the computer $TargetObject. Verify that the computer exists on the network and that the name provided is spelled correctly. For more information, see the about_Remote_Troubleshooting Help topic."
            $Exception = New-Object -TypeName System.InvalidOperationException -ArgumentList $ErrorMessage
    
            Write-Error -ErrorId $ErrorId -TargetObject $TargetObject -Category $ErrorCategory -Message $ErrorMessage -Exception $Exception
        }
    
        it 'should be green because it should contain the TargetObject' {
            Invoke-Command -ComputerName TestComputer -ScriptBlock {1} -ErrorVariable ConnectionError -ErrorAction SilentlyContinue
            $ConnectionError.TargetObject | Should -Be 'UnknownHost'
        }
    }