Two ways to use Pester to Mock objects with strongly typed parameters

When writing Pester unit tests, it’s pretty common to want to Mock cmdlets so that you can validate they’ve been called when expected, and the expected number of times.

BeforeAll {
Mock “Some-Command” -MockWith {}
}

It “Should invoke Some-Command…


This content originally appeared on DEV Community and was authored by Mark Wragg

When writing Pester unit tests, it's pretty common to want to Mock cmdlets so that you can validate they've been called when expected, and the expected number of times.

BeforeAll {
  Mock "Some-Command" -MockWith {}
}

It "Should invoke Some-Command the expected number of times" {
  Should -Invoke "Some-Command" -Times 1 -Exactly
}

Some commands however can be difficult to Mock because one of more of their input parameters requires a specific type of object. An example of this is the Azure storage cmdlet New-AzStorageContext. This creates a Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext type object, which other storage cmdlets then expect as an input.

There's two ways to handle this:

1. Use New-MockObject

The New-MockObject Pester cmdlet allows you to create an object of a specified type, with the properties and methods that you require. For New-AzStorageContext you could do something like this:

Mock New-AzStorageContext -MockWith {
  New-MockObject -Type Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext -Properties @{
    StorageAccountName = 'somestorageaccount'
    Context            = @{
    StorageAccountName = 'somestorageaccount'
    }
  }
}

However for New-MockObject to work, the type you want to fake has to be available on the system (i.e the relevant module/cmdlets must be installed).

2. Use -RemoveParameterType

The alternative option is to use the -RemoveParameterType parameter on the Mock that needs to receive the strongly typed object. This removes the strong typing on the specified input parameter and means that you can therefore Mock the source object's output as just a [pscustomobject]. For example:

Mock New-AzStorageContext -MockWith {
  [pscustomobject]@{
    StorageAccountName = 'somestorageaccount'
    Context            = @{
    StorageAccountName = 'somestorageaccount'
    }
  }
}

And then on the receiving Mock you do:

Mock Get-AzStorageTable -RemoveParameterType 'Context' -MockWith {
  [pscustomobject]@{
    Name       = 'sometable'
    CloudTable = @{ Name = 'somename' }
  }
}

This also negates the need for the type to be available on the system where your tests execute.

For more on Mocking with Pester see here.


This content originally appeared on DEV Community and was authored by Mark Wragg


Print Share Comment Cite Upload Translate Updates
APA

Mark Wragg | Sciencx (2024-10-24T17:43:16+00:00) Two ways to use Pester to Mock objects with strongly typed parameters. Retrieved from https://www.scien.cx/2024/10/24/two-ways-to-use-pester-to-mock-objects-with-strongly-typed-parameters/

MLA
" » Two ways to use Pester to Mock objects with strongly typed parameters." Mark Wragg | Sciencx - Thursday October 24, 2024, https://www.scien.cx/2024/10/24/two-ways-to-use-pester-to-mock-objects-with-strongly-typed-parameters/
HARVARD
Mark Wragg | Sciencx Thursday October 24, 2024 » Two ways to use Pester to Mock objects with strongly typed parameters., viewed ,<https://www.scien.cx/2024/10/24/two-ways-to-use-pester-to-mock-objects-with-strongly-typed-parameters/>
VANCOUVER
Mark Wragg | Sciencx - » Two ways to use Pester to Mock objects with strongly typed parameters. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2024/10/24/two-ways-to-use-pester-to-mock-objects-with-strongly-typed-parameters/
CHICAGO
" » Two ways to use Pester to Mock objects with strongly typed parameters." Mark Wragg | Sciencx - Accessed . https://www.scien.cx/2024/10/24/two-ways-to-use-pester-to-mock-objects-with-strongly-typed-parameters/
IEEE
" » Two ways to use Pester to Mock objects with strongly typed parameters." Mark Wragg | Sciencx [Online]. Available: https://www.scien.cx/2024/10/24/two-ways-to-use-pester-to-mock-objects-with-strongly-typed-parameters/. [Accessed: ]
rf:citation
» Two ways to use Pester to Mock objects with strongly typed parameters | Mark Wragg | Sciencx | https://www.scien.cx/2024/10/24/two-ways-to-use-pester-to-mock-objects-with-strongly-typed-parameters/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.