使用Pester模拟带Pipeline参数的PowerShell函数时遇绑定错误
问题根源
你在Mock MyPipelineFunction 时,错误地在-MockWith参数中重新定义了完整的参数块。Pester的Mock命令会自动继承原函数的参数绑定规则,完全不需要手动重复声明参数;而你写的自定义脚本块无法正确处理管道输入的参数绑定逻辑,这才导致了报错。
解决方案
简化MyPipelineFunction的Mock逻辑,直接指定Mock的执行行为即可,无需重复声明参数:
调整后的完整测试代码
Import-Module "C:\temp\StackOverflow\PipelineMock\MyModule\MyModule.psm1" -Force InModuleScope 'MyModule' { Describe 'MyFunction' { BeforeAll { # 创建测试用DataTable实例 $dataTable = New-Object System.Data.DataTable $dataTable.Columns.Add("Column1", [System.String]) $row = $dataTable.NewRow() $row["Column1"] = "Sample Data" $dataTable.Rows.Add($row) # Mock DataTable创建逻辑,返回测试实例 Mock New-Object -ParameterFilter { $TypeName -eq 'System.Data.DataTable' } -MockWith { return $dataTable } # 简化Mock:直接指定空行为,自动继承原函数的管道参数绑定规则 Mock MyPipelineFunction -MockWith {} Mock Write-Output {} } It 'should call MyPipelineFunction' { MyFunction Assert-MockCalled Write-Output -Exactly 1 -Scope It Assert-MockCalled New-Object -Exactly 1 -Scope It -ParameterFilter {$TypeName -eq 'System.Data.DataTable'} Assert-MockCalled MyPipelineFunction -Exactly 1 -Scope It -ParameterFilter {$DataTable -eq $dataTable} } } }
额外说明
- Pester的
Mock默认会保留原函数的所有参数属性(包括ValueFromPipeline),所以不需要在-MockWith中重新定义参数块,只需要指定Mock要执行的逻辑即可。 - 如果你需要在Mock中访问传入的参数,直接在脚本块里使用原函数的参数名就行,比如:
Mock MyPipelineFunction -MockWith { # 直接使用原函数定义的$DataTable参数 Write-Verbose "Mock接收的DataTable列数:$($DataTable.Columns.Count)" }
内容的提问来源于stack exchange,提问作者Kurtis
相关产品推荐
相关产品推荐

