如何将PowerShell哈希表键值对传入Pester的TestCases参数完成单元测试
问题修复方案
核心错误原因
- 变量名引用错误:代码中BeforeAll块定义的预期值哈希表变量名为
$Expected,但TestCases参数中错误调用了不存在的变量$Optional,导致无法读取键值对。 - 变量作用域不匹配:BeforeAll块内定义的普通变量默认无法直接在It语句的参数区域访问,需要显式指定脚本作用域。
修正后可运行代码
BeforeAll { $script:Expected = @{ Address1='Address1' Address2='Address2' City='City' RegionCode='RegionCode' PostalCode='PostalCode' } } BeforeEach { Mock Invoke-SqlCmd Invoke-MyFunction @Expected } It "sets the column '<Name>' with the value '<Value>'" -TestCases ( $script:Expected.GetEnumerator() | ForEach-Object { @{Name=$_.Key; Value=$_.Value} } ) { param($Name, $Value) $Test = "*{0}='{1}'*" -f $Name, $Value Assert-MockCalled Invoke-Sqlcmd -ParameterFilter { $Query -like $Test } }
修改说明
- 在BeforeAll块定义
$Expected时添加$script:前缀,或者在TestCases引用时加$script:前缀,两种方式都可以解决作用域问题,确保Pester能正常读取哈希表内容。 - 修正了TestCases数据源的变量名,替换为实际存在的
$Expected。 - 转换逻辑保留原有写法,生成的每个哈希表键名和It语句的占位符
<Name>、<Value>完全对应,符合Pester TestCases的参数传入规则。
额外注意
如果实际业务场景中值可能包含单引号,需要提前对$Value做单引号转义处理,避免-f格式化时生成的查询匹配字符串出错。
内容的提问来源于stack exchange,提问作者craig
相关产品推荐
相关产品推荐

