如何在 Powershell 中使用 Pester 模拟 ErrorRecord?
How can you mock an ErrorRecord with Pester in Powershell?
我有一个函数想包含在我的单元测试中,但我不知道如何做。该方法接受一个 ErrorRecord 对象(来自 Invoke-RestMethod 调用),获取状态代码并生成自定义错误消息。以下是通话的第一部分:
function Resolve-RestError {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
$RequestError
)
$statusCode = $requestError.Exception.Response.StatusCode.value__
switch ($statusCode) {
我 运行 遇到的问题是重新创建 ErrorRecord 对象。我花了很多时间寻找重新创建错误对象的方法,但我无法准确地重新创建它。
在执行期间的实际 ErrorRecord 对象中,访问 Response.StatusCode 字段 returns 带有代码描述的字符串。要访问实际值,您需要调用 Response.StatusCode.value__。似乎不可能重建内部 .value__ 变量,因为这是由 JIT 编译器完成的(根据我的理解)。有没有办法将 .value__ 属性 添加到自定义对象,或者在我的测试期间简单地模拟该变量?
你说得对,重新创建 ErrorRecord 对象似乎并不太简单。对于这种事情,我的目标是模拟我想在测试中模拟的输出,然后通过 Export-CliXml
存储该结果,但是当使用 ErrorRecord 尝试此操作时,您只能得到 Exception.Response 和其余部分在转换中丢失(即使设置 -Depth
值)。
可能有更聪明的方法,但一种解决方法是按如下方式伪造对象(请注意,您没有提供完整的函数,所以我只是创建了一个简化版本来证明它适用于这个特定的案例):
function Resolve-RestError {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
$RequestError
)
$statusCode = $RequestError.Exception.Response.StatusCode.value__
Return $statusCode
}
Describe 'Resolve-RestError' {
It 'Should handle a 404' {
$ErrorRecord = [pscustomobject]@{
Exception = @{
Response = @{
StatusCode = @{
value__ = 404
}
}
}
}
Resolve-RestError -RequestError $ErrorRecord | Should -Be 404
}
}
我有一个函数想包含在我的单元测试中,但我不知道如何做。该方法接受一个 ErrorRecord 对象(来自 Invoke-RestMethod 调用),获取状态代码并生成自定义错误消息。以下是通话的第一部分:
function Resolve-RestError {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
$RequestError
)
$statusCode = $requestError.Exception.Response.StatusCode.value__
switch ($statusCode) {
我 运行 遇到的问题是重新创建 ErrorRecord 对象。我花了很多时间寻找重新创建错误对象的方法,但我无法准确地重新创建它。
在执行期间的实际 ErrorRecord 对象中,访问 Response.StatusCode 字段 returns 带有代码描述的字符串。要访问实际值,您需要调用 Response.StatusCode.value__。似乎不可能重建内部 .value__ 变量,因为这是由 JIT 编译器完成的(根据我的理解)。有没有办法将 .value__ 属性 添加到自定义对象,或者在我的测试期间简单地模拟该变量?
你说得对,重新创建 ErrorRecord 对象似乎并不太简单。对于这种事情,我的目标是模拟我想在测试中模拟的输出,然后通过 Export-CliXml
存储该结果,但是当使用 ErrorRecord 尝试此操作时,您只能得到 Exception.Response 和其余部分在转换中丢失(即使设置 -Depth
值)。
可能有更聪明的方法,但一种解决方法是按如下方式伪造对象(请注意,您没有提供完整的函数,所以我只是创建了一个简化版本来证明它适用于这个特定的案例):
function Resolve-RestError {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
$RequestError
)
$statusCode = $RequestError.Exception.Response.StatusCode.value__
Return $statusCode
}
Describe 'Resolve-RestError' {
It 'Should handle a 404' {
$ErrorRecord = [pscustomobject]@{
Exception = @{
Response = @{
StatusCode = @{
value__ = 404
}
}
}
}
Resolve-RestError -RequestError $ErrorRecord | Should -Be 404
}
}