【问题标题】:How can you mock an ErrorRecord with Pester in Powershell?如何在 Powershell 中使用 Pester 模拟 ErrorRecord?
【发布时间】:2020-06-25 23:17:57
【问题描述】:

我有一个函数想包含在我的单元测试中,但我不知道怎么做。该方法接受一个 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 字段会返回一个带有代码描述的字符串。要访问实际值,您需要调用 Response.StatusCode.value__。似乎不可能重建内部 .value__ 变量,因为这是由 JIT 编译器完成的(据我了解)。有没有办法将 .value__ 属性添加到自定义对象,或者在我的测试期间简单地模拟该变量?

【问题讨论】:

    标签: powershell unit-testing error-handling pester


    【解决方案1】:

    你说得对,重新创建一个 ErrorRecord 对象似乎并不太简单。我对这类事情的 goto 是模拟我想在我的测试中模拟的输出,然后通过 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
        }
    }
    

    【讨论】:

    • 有趣的想法,对于 value__ = 404,基本上只是隐式地将枚举值分配为状态码的属性?
    • 是的,我认为严格来说它只会显示为整数属性。这不是创建等效对象,但它可能足以让您的函数正确触发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多