有没有办法模拟 $? return 使用 Pester?

Is there a way to mock an $? return using Pester?

我正在使用 Pester 为 PowerShell 应用程序编写测试。

我已经能够为大多数函数创建模拟,但我无法模拟return使用 $? 变量的函数。我目前正在使用它来评估来自 AWS CLI 命令的 returns。

例如,这是模拟失败的 AWS CLI 命令 return。

有什么想法吗?

你应该可以做到:

Mock AWC-CLI { $ = $true } -Verifiable

如果你想获得与 $? 执行相同功能的模拟代码,你可以使用类似这样的东西(如果多个,它实际上 returns 的方式非常有限行一次执行等,可能需要根据执行上下文修改):

Function Test-LastCommandError {
    $LastCommand = (History | Select -Last 1).CommandLine
    $LastError = $Error[-1].InvocationInfo.Line
    $LastCommand -eq $LastError
}

1/1#Success
Test-LastCommandError # Returns false

1/0#Error
Test-LastCommandError # Returns true

这适用于我手动执行每一行,但不适用于临时 ISE window(因为它在执行时将所有内容复制粘贴为一个命令)。

我们创建了一个辅助函数并传递了 $? 值。

function Test-LastExitCodeIsFalse ($last_exit) {
    if ($last_exit) {
       return $false
    }
    $true
}

一个用法是

aws s3 <an aws command>
if (Test-LastExitCodeIsFalse($?)) {
   throw "AWS Exception"
}

使用 Pester,然后我们将 Test-LastExitCodeIsFalse 函数模拟为 return false。我们有一个失败的 AWS 实例的单元测试:)