如何在Pester中使用Mock并解决Get-ChildItem模拟报错问题
问题根因
报错的核心原因是参数符号不合法:你编写的Mock语句中,MockWith参数前的横杠使用了长破折号(–)而非PowerShell语法要求的半角减号(-)。PowerShell无法识别该符号为参数前缀,会把后续内容整体识别为字符串,无法转换为MockWith参数要求的ScriptBlock类型,因此抛出类型转换异常,报错信息里的乱码â€就是长破折号的编码异常显示。
修复后的代码
It 'Test get latest version' { Mock -CommandName 'Test-Path' -MockWith { return $true } Mock -CommandName 'Get-ChildItem' -MockWith { $MockedListOfDirectories = @( 'test_1.0.1.1', 'test_1.1.10.5', 'test_1.1.10.1', 'test_1.2.18.1', 'test_1.4.7.0' ) # 可选优化:如果后续逻辑依赖Get-ChildItem返回的DirectoryInfo对象属性(比如Name、FullName),可以改成返回模拟对象: # return $MockedListOfDirectories | ForEach-Object { [PSCustomObject]@{ Name = $_; FullName = "C:\test\$_" } } return $MockedListOfDirectories } # 此处补充你原本要执行的测试逻辑即可 }
补充说明
- 如果后续测试逻辑中需要调用
Get-ChildItem返回结果的属性(比如.Name取文件夹名、.FullName取完整路径),建议模拟返回和原生命令输出结构一致的PSCustomObject,避免后续逻辑因为类型不匹配报错。 - 编写PowerShell代码时不要从Word、Pages等排版软件中直接复制粘贴符号,这类软件会自动把半角减号替换为长破折号,导致语法异常。
内容的提问来源于stack exchange,提问作者user16908085
相关产品推荐
相关产品推荐

