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
相关产品推荐
相关产品推荐

