有没有办法使用 Pester 测试/断言 Write-Host 的输出?
Is there a way to test / assert output from Write-Host using Pester?
我正在为一个相当复杂的脚本编写测试,脚本中有一个特定的函数可以向用户输出不同系列的日志消息。我想断言是否正在显示特定的日志消息。
主要问题是我不知道哪个参数正在隐式处理我传递给 Write-Host
cmdlet 的文本。
这是一些代码,它捕捉了我正在尝试做的事情的前提...
要测试的函数
function TestFunction($TestInput) {
if ($TestInput -contains 1) {
Write-Host "TestInput contains a 1"
}
if ($TestInput -contains 3 ) {
Write-Host "TestInput contains a 3"
}
if ($TestInput -contains 4 ) {
Write-Host "TestInput contains a 4"
}
}
纠缠测试
Describe "TestFunction" {
It "should call Write-Host with appropriate message if 1 or 3 is passed" {
Mock Write-Host {}
TestFunction -TestInput @(1, 2, 3)
Assert-MockCalled Write-Host -Exactly 2 -Scope It
Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { "TestInput contains a 1" }
Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { "TestInput contains a 3" }
}
}
输出
Describing TestFunction
[-] should call Write-Host with appropriate message if 1 or 3 is passed 19ms
at <ScriptBlock>, : line 235
235: Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { "TestInput contains a 1" }
Expected Write-Host to be called 1 times exactly but was called 2 times
Tests completed in 106ms
Tests Passed: 0, Failed: 1, Skipped: 0, Pending: 0, Inconclusive: 0
查看 Microsoft documentation for the Write-Host
cmdlet 后,我发现有一个 -Object
参数。这接受一组通用对象以写入控制台。 -Object
参数是需要在 Pester 测试的 -ParameterFilter
中指定的参数,以便断言正在显示适当的文本。
我更新后的代码如下...
要测试的函数
function TestFunction($TestInput) {
if ($TestInput -contains 1) {
Write-Host "TestInput contains a 1"
}
if ($TestInput -contains 3 ) {
Write-Host "TestInput contains a 3"
}
if ($TestInput -contains 4 ) {
Write-Host "TestInput contains a 4"
}
}
纠缠测试
Describe "TestFunction" {
It "should call Write-Host with appropriate message if 1 or 3 is passed" {
Mock Write-Host {}
TestFunction -TestInput @(1, 2, 3)
Assert-MockCalled Write-Host -Exactly 2 -Scope It
Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { $Object -eq "TestInput contains a 1" }
Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { $Object -eq "TestInput contains a 3" }
}
}
输出
Describing TestFunction
[+] should call Write-Host with appropriate message if 1 or 3 is passed 20ms
Tests completed in 99ms
Tests Passed: 1, Failed: 0, Skipped: 0, Pending: 0, Inconclusive: 0
我正在为一个相当复杂的脚本编写测试,脚本中有一个特定的函数可以向用户输出不同系列的日志消息。我想断言是否正在显示特定的日志消息。
主要问题是我不知道哪个参数正在隐式处理我传递给 Write-Host
cmdlet 的文本。
这是一些代码,它捕捉了我正在尝试做的事情的前提...
要测试的函数
function TestFunction($TestInput) {
if ($TestInput -contains 1) {
Write-Host "TestInput contains a 1"
}
if ($TestInput -contains 3 ) {
Write-Host "TestInput contains a 3"
}
if ($TestInput -contains 4 ) {
Write-Host "TestInput contains a 4"
}
}
纠缠测试
Describe "TestFunction" {
It "should call Write-Host with appropriate message if 1 or 3 is passed" {
Mock Write-Host {}
TestFunction -TestInput @(1, 2, 3)
Assert-MockCalled Write-Host -Exactly 2 -Scope It
Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { "TestInput contains a 1" }
Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { "TestInput contains a 3" }
}
}
输出
Describing TestFunction
[-] should call Write-Host with appropriate message if 1 or 3 is passed 19ms
at <ScriptBlock>, : line 235
235: Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { "TestInput contains a 1" }
Expected Write-Host to be called 1 times exactly but was called 2 times
Tests completed in 106ms
Tests Passed: 0, Failed: 1, Skipped: 0, Pending: 0, Inconclusive: 0
查看 Microsoft documentation for the Write-Host
cmdlet 后,我发现有一个 -Object
参数。这接受一组通用对象以写入控制台。 -Object
参数是需要在 Pester 测试的 -ParameterFilter
中指定的参数,以便断言正在显示适当的文本。
我更新后的代码如下...
要测试的函数
function TestFunction($TestInput) {
if ($TestInput -contains 1) {
Write-Host "TestInput contains a 1"
}
if ($TestInput -contains 3 ) {
Write-Host "TestInput contains a 3"
}
if ($TestInput -contains 4 ) {
Write-Host "TestInput contains a 4"
}
}
纠缠测试
Describe "TestFunction" {
It "should call Write-Host with appropriate message if 1 or 3 is passed" {
Mock Write-Host {}
TestFunction -TestInput @(1, 2, 3)
Assert-MockCalled Write-Host -Exactly 2 -Scope It
Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { $Object -eq "TestInput contains a 1" }
Assert-MockCalled Write-Host -Exactly 1 -Scope It -ParameterFilter { $Object -eq "TestInput contains a 3" }
}
}
输出
Describing TestFunction
[+] should call Write-Host with appropriate message if 1 or 3 is passed 20ms
Tests completed in 99ms
Tests Passed: 1, Failed: 0, Skipped: 0, Pending: 0, Inconclusive: 0