脚本在 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
所以我在 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