You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:16:19