如何在Powershell中使用Pester模拟错误记录?

如何在Powershell中使用Pester模拟错误记录?,powershell,unit-testing,error-handling,pester,Powershell,Unit Testing,Error Handling,Pester,我有一个函数,我想包括在我的单元测试中,但我不知道如何。该方法接收ErrorRecord对象(来自调用RestMethod调用),获取状态代码并生成自定义错误消息。以下是通话的第一部分内容: function Resolve-RestError { [CmdletBinding()] param( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] $RequestError

我有一个函数,我想包括在我的单元测试中,但我不知道如何。该方法接收ErrorRecord对象(来自调用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_u变量,因为这是由JIT编译器完成的(据我所知)。有没有一种方法可以向自定义对象添加.value属性,或者在测试期间简单地模拟该变量?

你说得对,重新创建ErrorRecord对象似乎并不太简单。对于这类事情,我的目标是模拟我想在测试中模拟的输出,然后通过
Export-CliXml
存储该结果,但是当使用错误记录尝试此操作时,您只能得到异常。响应,其余部分在转换过程中丢失(即使设置
-Depth
值)

可能有一种更聪明的方法,但一种解决方法是如下伪造对象(注意,您没有提供完整的功能,所以我只是创建了一个简化版本,以证明它适用于此特定情况):


有趣的想法是,对于值_u=404,基本上只是隐式地分配一个枚举值作为状态代码的属性?是的,我认为严格地说,它只会显示为一个整数属性。这并不是创建一个等价的对象,但它可能足以让您的函数正常启动。
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
    }
}