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

Pester测试中Mock Get-AzKeyVaultSecret失效,触发Connect-AzAccount报错

问题原因及解决方案

为什么自定义函数没生效?

  • 你在BeforeAll里定义的Get-AzKeyVaultSecret函数,作用域仅局限于测试脚本会话,但Read-VaultSecret属于appsettings.psm1模块,它会优先调用Az.KeyVault模块中已加载的原生Get-AzKeyVaultSecret,而非你自定义的函数,因此仍会触发真实的Azure登录逻辑。
  • 若测试前已加载Az.KeyVault模块,PowerShell会优先使用模块内的cmdlet,不会识别你在脚本中定义的同名函数。

完全可行:用Pester Mock实现离线测试

Pester原生支持拦截Azure cmdlet调用,无需连接Azure环境即可完成测试,正确做法是使用Mock命令而非手动定义同名函数,具体步骤如下:

1. 加载自定义模块

在测试脚本开头确保加载你的模块:

BeforeAll {
    # 强制加载自定义模块,确保测试用的是最新版本
    Import-Module $PSScriptRoot/appsettings.psm1 -Force
    # 无需加载Az.KeyVault模块,Mock会拦截所有相关调用
}

2. 用Mock拦截目标cmdlet

在BeforeAll或Describe块内配置Mock,关键是指定-ModuleName参数,确保Mock覆盖模块内的调用:

BeforeAll {
    Mock Get-AzKeyVaultSecret {
        # 返回模拟的密钥对象,匹配真实cmdlet的输出结构
        [PSCustomObject]@{
            SecretValue = [Microsoft.Azure.Commands.KeyVault.Models.PSSecretValue]::new("模拟密钥内容")
        }
    } -ModuleName appsettings
}

3. 编写测试用例

Describe "Read-VaultSecret 功能测试" {
    It "应返回模拟的密钥内容" {
        $result = Read-VaultSecret -VaultName "TestVault" -SecretName "TestSecret"
        $result.SecretValue.Text | Should -Be "模拟密钥内容"
        # 验证Mock确实被调用过
        Should -Invoke Get-AzKeyVaultSecret -Exactly 1 -Scope It
    }
}

额外注意事项

  • 若Read-VaultSecret还调用了其他Azure cmdlet(如Get-AzKeyVault),用同样的Mock方式拦截即可。
  • 测试环境中尽量避免加载Az.KeyVault模块,防止原生cmdlet干扰Mock;若必须加载,务必通过-ModuleName参数指定Mock的作用模块,确保优先级高于原生cmdlet。

内容的提问来源于stack exchange,提问作者KingBain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 01:59:54