You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:55:20