gpt4 book ai didi

powershell - 为什么 Pester 不使用陷阱捕获错误

转载 作者:行者123 更新时间:2023-12-02 23:26:05 25 4
gpt4 key购买 nike

我想知道为什么在运行此脚本时会出现以下行为。我在 PowerShell ISE(v4 主机)中加载了脚本并加载了 Pester 模块。我按 F5 运行脚本。

function Test-Pester {
throw("An error")
}

Describe "what happens when a function throws an error" {

Context "we test with Should Throw" {

It "Throws an error" {
{ Test-Pester } | Should Throw
}
}

Context "we test using a try-catch construct" {

$ErrorSeen = $false
try {
Test-Pester
}
catch {
$ErrorSeen = $true
}

It "is handled by try-catch" {
$ErrorSeen | Should Be $true
}
}

Context "we test using trap" {

trap {
$ErrorSeen = $true
}

$ErrorSeen = $false

Test-Pester

It "is handled by trap" {
$ErrorSeen | Should Be $true
}
}
}

然后我得到以下输出:
Describing what happens when a function throws an error
Context we test with Should Throw
[+] Throws an error 536ms
Context we test using a try-catch construct
[+] is handled by try-catch 246ms
Context we test using trap
An error
At C:\Test-Pester.ps1:2 char:7
+ throw("An error")
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (An error:String) [], RuntimeException
+ FullyQualifiedErrorId : An error

[-] is handled by trap 702ms
Expected: {True}
But was: {False}
at line: 40 in C:\Test-Pester.ps1
40: $ErrorSeen | Should Be $true

问题

为什么是 trap{}显然没有在最终测试中运行?

最佳答案

以下是基于@PetSerAl 和@Eris 的评论/建议答案的问题的两种解决方案。我也已阅读并赞赏对这个问题的回答:

Why are variable assignments within a Trap block not visible outside it?

解决方案 1

尽管可以在陷阱中读取脚本中设置的变量,但您在陷阱中所做的任何事情都会发生在该变量的副本中,即仅在陷阱的本地范围内。在此解决方案中,我们评估对 $ErrorSeen 的引用。这样当我们设置变量的值时,我们实际上是在设置存在于父作用域中的变量的值。

添加 continue到陷阱抑制 ErrorRecord 详细信息,清理测试的输出。

Describe "what happens when a function throws an error" {
Context "we test using trap" {

$ErrorSeen = $false

trap {
Write-Warning "Error trapped"
([Ref]$ErrorSeen).Value = $true
continue
}

Test-Pester

It "is handled by trap" {
$ErrorSeen | Should Be $true
}
}
}

解决方案 2

按照与第一个解决方案相同的思路,可以通过显式设置 $ErrorSeen 的范围来解决问题。变量 (1) 首次创建时和 (2) 在 trap {} 中使用时.我在这里使用了 Script 范围,但 Global 似乎也可以工作。

同样的原则也适用于这里:我们需要避免陷阱中变量的更改仅发生在变量的本地副本上的问题。
Describe "what happens when a function throws an error" {
Context "we test using trap" {

$Script:ErrorSeen = $false

trap {
Write-Warning "Error trapped"
$Script:ErrorSeen = $true
continue
}

Test-Pester

It "is handled by trap" {
$ErrorSeen | Should Be $true
}
}
}

关于powershell - 为什么 Pester 不使用陷阱捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36652319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com