纠缠 "Should -Invoke does not take pipeline input or ActualValue"
Pester "Should -Invoke does not take pipeline input or ActualValue"
我正在使用以下测试代码:
Describe "Install-Programs"{
Context "Install-Programs"{
BeforeAll{
Mock Start-Process {}
}
It "Tests"{
My-CustomFunction #Should invoke Start-Process
Should -Invoke Start-Process -Times 1 -Exactly
}
}
}
它给了我以下错误:
在 My-CustomFunction
中对 Start-Process
的调用没有获得任何管道输入,也没有通过管道传输到任何管道:
function My-CustomFunction(){
...
(New-Object System.Net.WebClient).DownloadFile($URL, "$($Env:TEMP)$Index.exe")
Start-Process -FilePath "$($Env:TEMP)$Index.exe" -ArgumentList "/S"
...
}
我没有得到你在给出的例子中看到的错误。我可以看到错误实际上表明 Should -Invoke
没有被正确使用,并且它似乎认为它正在提供管道输入或 Should
的 ActualValue
参数的值.但是,使用您提供的示例(进行少量编辑,以便 downloadfile
行不会因缺少输入而出错)对我来说效果很好:
Describe "Install-Programs" {
BeforeAll {
function My-CustomFunction() {
$URL = 'https://www.google.com'
(New-Object System.Net.WebClient).DownloadFile($URL, "$($Env:TEMP)$Index.exe")
Start-Process -FilePath "$($Env:TEMP)$Index.exe" -ArgumentList "/S"
}
}
Context "Install-Programs" {
BeforeAll {
Mock Start-Process {}
}
It "Tests" {
My-CustomFunction
Should -Invoke Start-Process -Times 1 -Exactly
}
}
}
我建议仔细检查 how/where 你正在使用 Should -Invoke
以确保它没有收到你不想要的一些输入。
My-CustomFunction
将它输出的任何值返回给变量可能是值得的。即,将您的测试更改为:
It "Tests"{
$MyResult = My-CustomFunction #Should invoke Start-Process
Should -Invoke Start-Process -Times 1 -Exactly
}
可能是您的函数正在向标准输出返回一个值,然后由 Should
获取该值。
或者,这可能是您使用的 Pester 版本中的错误。我正在使用 5.3.1。通过 Get-Module Pester -ListAvailable
.
检查您的 Pester 版本
我正在使用以下测试代码:
Describe "Install-Programs"{
Context "Install-Programs"{
BeforeAll{
Mock Start-Process {}
}
It "Tests"{
My-CustomFunction #Should invoke Start-Process
Should -Invoke Start-Process -Times 1 -Exactly
}
}
}
它给了我以下错误:
在 My-CustomFunction
中对 Start-Process
的调用没有获得任何管道输入,也没有通过管道传输到任何管道:
function My-CustomFunction(){
...
(New-Object System.Net.WebClient).DownloadFile($URL, "$($Env:TEMP)$Index.exe")
Start-Process -FilePath "$($Env:TEMP)$Index.exe" -ArgumentList "/S"
...
}
我没有得到你在给出的例子中看到的错误。我可以看到错误实际上表明 Should -Invoke
没有被正确使用,并且它似乎认为它正在提供管道输入或 Should
的 ActualValue
参数的值.但是,使用您提供的示例(进行少量编辑,以便 downloadfile
行不会因缺少输入而出错)对我来说效果很好:
Describe "Install-Programs" {
BeforeAll {
function My-CustomFunction() {
$URL = 'https://www.google.com'
(New-Object System.Net.WebClient).DownloadFile($URL, "$($Env:TEMP)$Index.exe")
Start-Process -FilePath "$($Env:TEMP)$Index.exe" -ArgumentList "/S"
}
}
Context "Install-Programs" {
BeforeAll {
Mock Start-Process {}
}
It "Tests" {
My-CustomFunction
Should -Invoke Start-Process -Times 1 -Exactly
}
}
}
我建议仔细检查 how/where 你正在使用 Should -Invoke
以确保它没有收到你不想要的一些输入。
My-CustomFunction
将它输出的任何值返回给变量可能是值得的。即,将您的测试更改为:
It "Tests"{
$MyResult = My-CustomFunction #Should invoke Start-Process
Should -Invoke Start-Process -Times 1 -Exactly
}
可能是您的函数正在向标准输出返回一个值,然后由 Should
获取该值。
或者,这可能是您使用的 Pester 版本中的错误。我正在使用 5.3.1。通过 Get-Module Pester -ListAvailable
.