如何在 Pester 中模拟一份工作?

How to mock a job in Pester?

我们正在尝试评估 Invoke-Command 是否被调用了一次。

脚本.ps1

$job = Invoke-Command -ScriptBlock {'test'} -ComputerName localhost -AsJob 
$job | Wait-Job

Script.Tests.ps1

BeforeAll {
    $testScript = $PSCommandPath.Replace('.Tests.ps1', '.ps1')
    Mock Invoke-Command
}
Describe 'Test' {
    It 'should be green' {
        . $testScript
        Should -Invoke Invoke-Command -Times 1 -Exactly -Scope It
    }
}

问题是在 Pester 中模拟作业对象。当作业未被模拟时,Wait-Job 将抛出一个错误,表示它没有收到作业对象。

如何在 Pester 中模拟 PowerShell 作业对象?

一个解决方案可能是让 Invoke-Command 的 Mock 仍然创建一个合法的作业,但是为了测试目的执行一些您认为安全的 script/code。

为此,您需要先将 Invoke-Command cmdlet 放入一个变量中,以便您可以通过该变量使用它(因为 Mock 不能直接调用它自己的命令) .

例如:

$InvokeCommand = Get-Command Invoke-Command

Mock Invoke-Command {
     & $InvokeCommand -ScriptBlock {'some safe alternative code'} -ComputerName localhost -AsJob
}