Pester中ParameterFilter参数化时字符串参数未解析问题
问题根本原因
Pester 的 -ParameterFilter 脚本块不会在你定义 Mock 的作用域下执行,而是会在每次调用被模拟命令时,在 Pester 内部的独立上下文执行。你在 MockVstsInput 函数中定义的局部变量 $inputName、$returnValue 仅在函数执行的短暂时间内存在,当后续实际调用 Get-VstsInput 触发 Mock 校验时,函数作用域已经销毁,脚本块无法捕获到当时的变量值,因此匹配逻辑永远不成立。
你之前尝试的方案失效的核心原因是都没有解决变量作用域的根本问题:
- 调换参数顺序、动态扩展字符串时,执行过滤逻辑的上下文中
$inputName仍然是空值 GetNewClosure仅能捕获当前会话作用域的变量,Pester 执行过滤时会重绑定脚本块作用域,闭包捕获的变量也会失效- 直接调用
[ScriptBlock]::Create时如果保留变量引用而不是写入实际值,执行时仍然会找不到对应变量
解决方案
构造脚本块时直接把变量值作为字面量拼入,把动态变量转换成固定的字符串硬编码到过滤逻辑里,完全规避作用域捕获问题。
修正后的MockVstsInput代码如下:
Function MockVstsInput { Param( [Parameter(Mandatory=$true, Position=1)] [string]$inputName, [Parameter(Mandatory=$true, Position=2)] [string]$returnValue ) # 转义变量中的单引号,避免构造脚本块时出现语法错误 $escapedInputName = $inputName.Replace("'", "''") $escapedReturnValue = $returnValue.Replace("'", "''") # 把变量值直接拼入脚本块,替换成固定字面量 $filterScript = [ScriptBlock]::Create("`$Name -eq '$escapedInputName'") $returnScript = [ScriptBlock]::Create("return '$escapedReturnValue'") Mock Get-VstsInput $returnScript -ParameterFilter $filterScript }
内容的提问来源于stack exchange,提问作者mirind4
相关产品推荐
相关产品推荐

