当我尝试让这个 pester 测试为接收管道参数的函数工作时,收到以下错误。
“运行 Pester 时发生错误:输入对象无法绑定到该命令的任何参数,因为该命令不接受管道输入,或者输入及其属性与任何接受管道输入的参数不匹配。”
模块:MyModule.psm1
function MyFunction {
"piping to Write-Output" | Write-Output
$dataTable = New-Object System.Data.DataTable
$dataTable | MyPipelineFunction
}
function MyPipelineFunction {
[CmdletBinding()]
param (
[Parameter(
Mandatory = $true,
ValueFromPipeline=$true)]
[System.Data.DataTable] $DataTable
)
Write-Host "hello world"
}
骚扰测试
Import-Module "C:\temp\StackOverflow\PipelineMock\MyModule\MyModule.psm1" -Force
InModuleScope 'MyModule' {
Describe 'MyFunction' {
BeforeAll {
# Create a sample 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 the DataTable creation in MyInternalFunction
Mock -CommandName New-Object -ParameterFilter { $TypeName -eq 'System.Data.DataTable' } -MockWith { return $dataTable }
Mock MyPipelineFunction -MockWith {[CmdletBinding()] param (
[Parameter(
Mandatory = $true,
ValueFromPipeline=$true)]
[System.Data.DataTable] $DataTable
)
}
Mock Write-Output {}
}
It 'should call MyPipelineFunction' {
MyFunction
Assert-MockCalled -CommandName Write-Output -Exactly 1 -Scope It
Assert-MockCalled -CommandName New-Object -Exactly 1 -Scope It -ParameterFilter {$TypeName -eq 'System.Data.DataTable' }
Assert-MockCalled -CommandName MyPipelineFunction -Exactly 1 -Scope It -ParameterFilter {$DataTable -eq $dataTable}
}
}
}
根据我找到的信息,我有几个不同的 Mock 方法和参数过滤器。Pester 网站似乎没有对此提供任何明确的指导。我能够为 Write-Output 编写一个基本的模拟,我将文本传输到它,效果很好。
有人能看出这个问题吗?