纠缠 "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 没有被正确使用,并且它似乎认为它正在提供管道输入或 ShouldActualValue 参数的值.但是,使用您提供的示例(进行少量编辑,以便 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 版本