如何在 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
}
我们正在尝试评估 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
}