Since I cannot Mock “[ADSI]”WinNt://$C” at least to the best of my knowledge with Pester without throwing it into a function itself and then mocking that function. I am trying to mock the Where-Object Cmdlet with a parameter filter using Pester. However I have not had any luck. I’ve tried everything I can think of and cannot get it to work. I suspect that it is an issue of the parameter taking a scriptblock.
Below is a basic example of what I’m trying to do. The end result is I want to mock a specific Where-Object Cmdlet to feed in fake testdata to test some other logic. If anyone can give me some pointers I would appreciate it.
Function I’m trying to run Pester test on
function Get-LocalUser {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[String[]]$Name,
[Parameter(ValueFromPipelineByPropertyName=$true)]
[String[]]$ComputerName = $env:COMPUTERNAME
)
Process
{
foreach ($C in $ComputerName)
{ # Do this for each computer in the $ComputerName collection
Write-Verbose "Retrieving users on `"$C`""
$objOu = [ADSI]"WinNT://$C"
$localUsers = $objOu.psbase.Children | Where-Object { $_.psbase.SchemaClassName -match 'user' }
foreach ($n in $Name)
{
$users = $localUsers | Where-Object { $_.name -like $n }
# if a wildcard is used there may be more than one result, need to go through each one
foreach ($u in $users)
{
#ToDo: Add all properties to object and use format view to filter displayed data
$Obj = New-Object -TypeName PSObject -Property @{'Name' = $u.name.ToString();
'Description' = $u.description.ToString()}
Write-Output $Obj
}
}
}
}
}
Pester Test
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path).Replace(".Tests.", ".")
. "$here\$sut"
#helper function
function createUsers([String[]]$User)
{
$userList = @()
foreach ($u in $User) {
$userList += [pscustomobject]@{ name = "$u"; description = "$u Account";}
}
$userList
}
Describe "Get-LocalUser" {
Context "Pipeline input" {
$user1 = "test1"
$user2 = "test2"
Mock Where-Object { createUsers -User $user1, $user2 } -ParameterFilter { $FilterScript -eq "{ `$_.psbase.SchemaClassName -match 'user' }" }
$result = 't*' | Get-LocalUser
It "Test to see of mock was called..." {
Assert-MockCalled Where-Object -Exactly 1 {} -ParameterFilter { $FilterScript -eq "{ `$_.psbase.SchemaClassName -match 'user' }" }
}
}
I verify that the mock never gets called by using the Assert-Mockcalled test