如何在Pester中模拟一个作业?

7
我们正在尝试评估 Invoke-Command 是否已被调用一次。 Script.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 工作对象呢?

1个回答

9

一种解决方案可能是使Mock的Invoke-Command仍然创建一个合法的作业,但执行您认为用于测试目的安全的某些脚本/代码。

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

例如:

$InvokeCommand = Get-Command Invoke-Command

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

这很好。简洁明了的方法。 - Ranadip Dutta
1
我不知道这是可能的。就像你说的那样,它一直在调用自己的“Mock”。喜欢你的解决方案!马克,大拇指向上 :) - DarkLite1
1
优秀的解决方案。 - toose121

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接