Pester BoundParams в CallHistory пусто

У меня есть простое, что на данный момент ничего не делает, я только начинаю с Пестером, но моя цель - смоделировать Remove-ADGroupMember и несколько других команд PowerShell AD для тестирования.

Param(
  [string]$computerList = ".\\computers.csv",
  [boolean]$isTest = $false
)

function Remove-Groups(){
  Remove-ADGroupMember -Identity "dale" -Members "dale","cameron"
}

и мой тестовый скрипт

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = "../" + (Split-Path -Leaf $MyInvocation.MyCommand.Path).Replace(".Tests.", ".")
. "$here\$sut"

Describe "UninstallUnused - Remove-Groups" {
    It "does something useful" {
      Mock Remove-ADGroupMember
      Remove-Groups
      Assert-MockCalled Remove-ADGroupMember -Exactly 1
      Assert-MockCalled Remove-ADGroupMember 1 -ParameterFilter {$Identity -eq "dale" -and $Members -contains "dale"}
    }
}

Первый Assert-MockCalled Линия работает, но независимо от того, что я пробую на втором, тесты всегда терпят неудачу. Через некоторое время я копался в функции Assert-MockCalled с помощью отладчика, и похоже, что значения параметра -Members теряются

введите описание изображения здесь

На картинке выше я нахожусь в функции Assert-MockCalled Mock.ps1, и, как вы можете видеть, значения, передаваемые членам, отсутствуют. Если я передаю только 1 значение в макет Remove-ADGroupMember следующим образом: Remove-ADGroupMember -Identity "dale" -Members "dale" значение, которое я вижу в BoundParams: {} вместо {, } как вы видите на скриншоте.

Это проблема с тем, как я это делаю, или проблема с тем, как приставник читает параметры и т.д. из Remove-ADGroupMember?

1 ответ

Решение

Параметры Identity и Members имеют тип String, поэтому ваши утверждения не работают.

  • Личность - Microsoft.ActiveDirectory.Management.ADGroup
  • Члены - Microsoft.ActiveDirectory.Management.ADPrincipal[]

Таким образом, чтобы заставить фильтр работать, вам нужно привести его к строке (типы, к счастью, сериализуются с нужными вам именами)

function Remove-Groups(){
  Remove-ADGroupMember -Identity "dale" -Members "dale","cameron"
}

Describe "UninstallUnused - Remove-Groups" {
    It "does something useful" {
      Mock Remove-ADGroupMember
      Remove-Groups
      Assert-MockCalled Remove-ADGroupMember -Exactly 1
      Assert-MockCalled Remove-ADGroupMember 1 -ParameterFilter {
        Write-Host ( $identity.GetType(),$members.GetType()) ; #otputting the data types
        ([string[]]$members) -contains "dale" -and ([string]$identity) -eq "dale" }
    }
}

Редактировать: Вы также можете использовать автоматическое приведение к левому параметру, но это облегчает взлом кода:

 ([string[]]$members -contains "dale") -and ("dale" -eq $identity)
Другие вопросы по тегам