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

PowerShell Pester问题:函数未识别及跨It块传递变量

Pester 5.6.1 两个问题的解决方案

问题1:Invoke-Pester运行时Get-Name函数未识别

错误原因:Pester 5默认采用隔离作用域执行测试,脚本顶层定义的Get-Name函数不会自动加载到测试作用域中;而PowerShell ISE直接运行脚本时,函数会被加载到全局作用域,测试块能正常访问,因此出现执行差异。

解决方法(任选其一):

  • 方法1:将函数移至Describe内的BeforeAll块
    把Get-Name函数放到Describe块的BeforeAll中,确保测试作用域能获取到函数定义:
    Describe {
        BeforeAll {
            function Get-Name {
                return "TestObject"
            }
            $Script:ObjectID
            $API = [API]::New() # 原脚本写法$API::[API]::New()有误,修正为正确的实例初始化方式
        }
    
        # 后续测试块...
    }
    
  • 方法2:在脚本开头点源自身
    在脚本最顶部添加BeforeAll { . $PSCommandPath },让测试作用域加载当前脚本的顶层内容:
    BeforeAll { . $PSCommandPath }
    
    function Get-Name {
        return "TestObject"
    }
    
    Describe {
        # 测试块...
    }
    
  • 方法3:调用Invoke-Pester时加-IncludeSelf参数
    执行命令时带上该参数,让脚本顶层代码在测试会话中执行:
    Invoke-Pester -Path c:\path\test.ps1 -Detailed -IncludeSelf
    

问题2:It块间无法传递ObjectID

错误原因:每个It块拥有独立的局部作用域,你在第一个It里赋值的$ObjectID是局部变量,并未修改BeforeAll中声明的$Script:ObjectID脚本作用域变量,导致第二个It块无法访问到目标值。

解决方法:
在第一个It块中,明确给**脚本作用域的$Script:ObjectID**赋值,而非局部变量:

It 'Get ObjectID By NAME' {
    $Name = Get-Name
    $Object = $API.GetObjectByName($Name)
    $Script:ObjectID = $Object.id # 绑定脚本作用域
    $Script:ObjectID | Should -BeGreaterThan 0
    Write-Host "ObjectID = $Script:ObjectID"
}

It 'Print Object ID' {
    Write-Host $Script:ObjectID # 访问脚本作用域变量
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:52:45