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

Dar*_*te1 6 powershell mocking pester

我们正试图评估是否Invoke-Command已经被称为一次.

Script.ps1

Get-Job | Remove-Job

Invoke-Command -ScriptBlock {'test'} -ComputerName localhost -AsJob

Wait-Job
Get-Job | Reveive-Job
Run Code Online (Sandbox Code Playgroud)

Script.Tests.ps1

Describe 'Test' {
    Mock Invoke-Command {
         # Mock here
    }
    It 'should be green' {
        ."$here\$sut" @Params
        Assert-MockCalled -CommandName Invoke-Command -Times 1 -Exactly -Scope It
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是在Pester中模拟工作对象.当作业未被模拟时,Wait-Job将抛出一个未收到作业对象的错误.

如何模拟PowerShell作业对象Pester

Mar*_*agg 6

一种解决方案可能是让MockInvoke-Command仍然创建一个合法的作业,但执行一些您认为安全的脚本/代码以进行测试.

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

例如:

$InvokeCommand = Get-Command Invoke-Command

Mock Invoke-Command {
     & $InvokeCommand -ScriptBlock {'some safe alternative code'} -ComputerName localhost -AsJob
}
Run Code Online (Sandbox Code Playgroud)