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)