问题描述
我正在用 C# 编写一个系统,该系统有许多要测试的功能。一个功能是一组 PowerShell 自定义 cmdlet,用于管理我的系统。
我正在使用 peter (v5) 来测试我的 cmdlet,并且会为我想要测试的许多场景提供大量测试用例。
我可以成功使用 pester,但我无法从测试中获得任何调试输出 - 只有测试报告。测试报告可以很好地查看通过和失败的内容,但如果我失败了,那么我希望能够输出可以让我了解发生问题的上下文的结果。
我已经尝试了所有我能想到的 pesterConfiguration 设置都无济于事,例如
$pesterPreference = [pesterConfiguration]::Default
#$pesterPreference.Output.Verbosity = "Diagnostic"
$pesterPreference.Debug.WriteDebugMessages = $true
#$pesterPreference.Debug.WriteDebugMessagesFrom = "*"
举个例子,假设我有一个 get-foo
cmdlet,它返回一个具有 Thing
属性的对象,该对象的值应该是 "Bar"
。
我可以编写一个纠缠测试来检查这一点,但我希望能够将返回的对象作为测试的一部分输出以查看如下内容:
Name Value
---- -----
Thing Bar
Other 124
Describe 'Test My CmdLet' {
It 'get-foo should return bar' {
$obj = get-foo
write-output $obj
$obj | Should -Not -BeNullOrEmpty
$obj.Thing | Should -Be "Bar"
}
}
如果没有获得输出的能力,那么我必须直接在 PowerShell 中在 pester 之外重建测试设置和结构 - 这是一个痛苦的过程。
如果有人对如何获得我的输出有任何建议,我将不胜感激。
谢谢,
大卫
解决方法
答案似乎是在脚本中设置 $VerbosePreference="Continue"
例如
$VerbosePreference = "Continue"
Describe 'Test My CmdLet' {
It 'get-foo should return bar' {
$obj = get-foo
$obj | out-string | write-verbose
$obj | Should -Not -BeNullOrEmpty
$obj.Thing | Should -Be "Bar"
}
}
将按预期转储 $obj
的详细信息。这也适用于 $DebugPreference、$InformationPeference 等。
您可以使用通过 -PassThru
获得的结果对象访问每个测试的 StandardOutput。演示:
# Just using a container here to avoid creating a testfile
$container = New-PesterContainer -ScriptBlock {
Describe 'Test My CmdLet' {
It 'get-foo should return bar' {
function get-foo { 1..3 | % { "hello $_" } }
$obj = get-foo
write-output $obj
$obj | Should -Not -BeNullOrEmpty
}
}
}
$pesterResult = Invoke-Pester -Container $container -PassThru
$pesterResult.tests | Format-Table ExpandedPath,StandardOutput
ExpandedPath StandardOutput
------------ --------------
Test My CmdLet.get-foo should return bar {hello 1,hello 2,hello 3}