脚本在 Pester 测试中返回 $null 的问题,而它不应该

Issue with script returning $null in Pester test while it shouldn't

所以我在 PowerShell 中遇到了一些问题 我为一个关于 Pester 测试的 class 项目写了一个简单的脚本 看起来像这样

param ([Parameter(Mandatory, ValueFromPipeline = $true)]$FN, [Parameter(Mandatory)]$OP, [Parameter()]$SN)

$solution

try {
    if ($OP -eq '+') {

        $solution = ([long]($FN) + [long]($SN))
    
    }

    elseif ($OP -eq '-') {

        $solution = ([long]($FN) - [long]($SN))
    
    }

    elseif ($OP -eq '*') {

        $solution = ([long]($FN) * [long]($SN))
    
    }

    elseif ($OP -eq '/') {

        if ($SecondNumber -eq 0) {
            $solution = "Cannot divide by 0";
        }

        $solution = ([long]($FN) / [long]($SN))
    
    }

    elseif ($OP -eq 'V') {
        $solution = ([math]::Sqrt($FN))
    
    }
    
    else {
        $solution = "Not a valid operator"
    }
    
}
catch {
    Write-Output "An error occured"
}

return $solution

现在一切正常,当我进入控制台并 运行 它与 ooutput 进入一个变量时它工作正常。

PS C:\PowerShellProject> $test = .\Script.ps1 1 + 1
PS C:\PowerShellProject> $test
2

但是当我 运行 这个 Pester 测试

Describe "Test for Script.ps1" {
    Context "Testing calculations" {
        It "+ test" {
            $plus = .\Test.ps1 -FN 2 -OP + -SN 2
            $plus | Should -Be 4
        }
    }
}

下面是returns

PS C:\PowerShellProject> Invoke-Pester .\Test.ps1

Starting discovery in 1 files.
Discovery found 1 tests in 15ms.
Running tests.

[-] Test for Script.ps1.Testing calculations.+ test 18ms (16ms|2ms)
 Expected 4, but got $null.
 at $plus | Should -Be 4, C:\PowerShellProject\Test.ps1:6
 at <ScriptBlock>, C:\PowerShellProject\Test.ps1:6
[-] Context Test for Script.ps1.Testing calculations failed
 InvalidOperationException: Collection was modified; enumeration operation may not execute.

Tests completed in 156ms
Tests Passed: 0, Failed: 1, Skipped: 0 NotRun: 1
BeforeAll \ AfterAll failed: 1
  - Test for Script.ps1.Testing calculations

我对 Powershell 还是很陌生,所以我一定是犯了一个愚蠢的错误。

也许有人可以将我重定向到另一个有类似问题的问题,或者给我一个问题的解决方案。这真的很有帮助,因为几个小时以来我一直在思考这个问题,它真的开始让我烦恼了。

问题出在函数开头的这一行:

$solution

这并没有像您预期的那样声明变量,但是由于 PowerShell 的隐式输出行为,它实际上 输出 变量。由于尚未定义变量,因此输出为 $null

要实际定义变量,您必须分配一个值:

$solution = 0

稍后,当您执行 return $solution 时,您实际上是在向输出流添加另一个值,当捕获到变量时,该值将是数组 @($null, 2).

证明:

$plus = .\Test.ps1 -FN 2 -OP + -SN 2            
Write-Host $plus.GetType().Name

这会打印 Object[],尽管我们期望 int.

在 PowerShell 中,您通常不使用 return 语句,除非您想提前退出函数。 return $solution 实际上只是一个快捷方式:

$solution  # implicit output
return     # exit from function

您的 Pester 测试脚本中还有另一个问题,您调用了错误的脚本。应该是:

$plus = .\Script.ps1 -FN 2 -OP + -SN 2