如何用Pester模拟函数中多次调用的不同用途PowerShell cmdlet
解决Pester Mock两次调用Get-ADGroupMember返回不同结果的问题
你的核心问题是没有正确区分两次Get-ADGroupMember调用的Mock规则,导致两次调用都返回了相同的2元素数组,最终总count为4。下面是具体的解决方法:
1. 按调用参数区分Mock(推荐)
如果你的函数中两次调用Get-ADGroupMember时传入的参数(比如-Identity)不同,可以用-ParameterFilter精准匹配每一次调用,分别设置返回值:
示例被测函数
function Get-GroupMembers { # 第一次调用,参数为GroupA $members1 = Get-ADGroupMember -Identity "GroupA" # 第二次调用,参数为GroupB $members2 = Get-ADGroupMember -Identity "GroupB" # 合并结果(根据你的逻辑调整) return $members1 + $members2 }
测试代码
Describe "Get-GroupMembers" { It "Returns expected count with different mock results" { # Mock第一次调用(匹配GroupA),返回2元素数组 Mock Get-ADGroupMember { @( [PSCustomObject]@{SamAccountName = "User1"}, [PSCustomObject]@{SamAccountName = "User2"} ) } -ParameterFilter { $Identity -eq "GroupA" } # Mock第二次调用(匹配GroupB),返回单个PSCustomObject Mock Get-ADGroupMember { [PSCustomObject]@{SamAccountName = "User3"} } -ParameterFilter { $Identity -eq "GroupB" } $result = Get-GroupMembers # 如果逻辑是合并两次结果,预期count为3;如果只取第一次结果,预期为2 $result.Count | Should -Be 3 } }
2. 按调用顺序区分Mock(参数相同时使用)
如果两次调用Get-ADGroupMember的参数完全相同,可使用Pester 5+支持的-Sequence参数,按调用顺序指定返回值:
示例被测函数
function Get-DuplicateGroupMembers { # 两次调用参数相同 $firstCall = Get-ADGroupMember -Identity "SameGroup" $secondCall = Get-ADGroupMember -Identity "SameGroup" return $firstCall + $secondCall }
测试代码
Describe "Get-DuplicateGroupMembers" { It "Returns expected count with sequential mocks" { # 第一次调用返回2元素数组 Mock Get-ADGroupMember -Sequence 1 { @( [PSCustomObject]@{SamAccountName = "User1"}, [PSCustomObject]@{SamAccountName = "User2"} ) } # 第二次调用返回单个PSCustomObject Mock Get-ADGroupMember -Sequence 2 { [PSCustomObject]@{SamAccountName = "User3"} } $result = Get-DuplicateGroupMembers $result.Count | Should -Be 3 } }
关键注意事项
- 确保单个
PSCustomObject返回时不要用@()包装,否则会被转为长度1的数组,影响最终count计算。 - 如果你的函数逻辑只需要第一次调用的结果,需检查是否误将两次结果合并,导致count超出预期。
内容的提问来源于stack exchange,提问作者JK Chai
相关产品推荐
相关产品推荐

