我正在编写大量使用API的脚本。对于来自Invoke-RestMethod调用的各种错误响应,我有一个大型的自定义错误处理功能,我希望能够对其进行适当的单元测试。
我通过使用Export-CliXml保存了其中一些错误,但是实际上我无法将对象重建回其原始形式。在某些时候,当我期望数据时,我只会得到字符串,而当我为Export-Clixml增加-Depth参数时,Powershell会花费大量时间来编写一个巨大的.xml文件。
例如,我从Invoke-RestMethod收到一个Http响应错误,我检查了状态代码并将其用于某些情况下的一些自定义错误处理。这是用$ErrorRecord.Exception.Response.StatusCode.Value__
抓取的。但是,当我尝试重建CliXml对象时,嵌套在“Response”对象中的所有内容都变成了一个字符串,而且我无法以相同的方式对其进行解析。
所以我的问题是:
Public testing API只会返回401未经授权的错误:
try {
$global:response = Invoke-RestMethod -Uri "https://reqres.in/api/login" -Method 'POST'
}
catch {
$global:err = $_
}
最佳答案
ConvertTo-Json是捕获异常及其嵌套属性的快速方法。指定-Depth
可以在对象树中导航超过默认的2层:
$global:err = $_ | ConvertTo-Json -Depth 3
然后,您可以使用ConvertFrom-Json将其反序列化回一个对象并访问属性:($Global:err | ConvertFrom-Json).ErrorDetails
如果包含运行缓慢的代码,将更容易发现问题,但是我希望您可能会遇到文件系统访问而不是代码问题。您可以使用Measure-Command隔离运行缓慢的代码的问题。编辑:看起来您在
ExportCli-Xml
的正确轨道上-内置的JSON序列化程序可能不像CliXml那样代表对象。我错过了需要反序列化回Error对象的要求。您可以尝试跳过Export并仅使用Management.Automation.PSSerializer。这段代码没有引发任何错误,并且很快:
$DeserializedError = [Management.Automation.PSSerializer]::DeSerialize([Management.Automation.PSSerializer]::Serialize($Error[0]))
关于powershell - 在Powershell中导出大型嵌套对象以便以后进行测试/模拟的最佳方法是什么?特别是Http和Web异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62560000/