Author Posts

August 23, 2017 at 3:02 pm

Hi,

I am trying to write a pester test for when my function throws an exception and I am unable to get this to work. I modified this some from my original code but the idea is the same. When I run Pester it fails at this assertion with an exception and says the test failed.

I expect and receive the following exception.
Exception Details: "MethodInvocationException: Exception calling "Substring" with 2 arguments: Index and length must refer to a location within the string.

Please advise.
Thanks.

function Select-SubString {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true,
            ValueFromPipeline = $true)]
        [string]$input
    )
    Write-Verbose "Taking input and creating substring variable"
    $substring = $($input.Substring(0, 25))
    return $substring
}
Import-Module MyModule

Describe "myModule.psm1" {
    InModuleScope myModule {
      $string = "abc"
      it 'should throw exception' {
       { $string.toString() | Select-SubString } | Should Throw MethodInvocationException
      }
   }
}

August 23, 2017 at 3:54 pm

Instead of MethodInvocationException, use a piece of the exception message like "Exception calling "Substring"" The string you're asserting is actually the type of exception. Pester is looking at the message.

August 23, 2017 at 7:27 pm

Thanks for the details Adam. That did work!

November 12, 2017 at 6:20 pm

I wrote a set of assertions that handle this correctly. Here they are used in their own tests Assert-Throw