我正在用C#编写一个系统,它有很多功能需要测试。一个功能是一组PowerShell自定义cmdlet,用于管理我的系统。
我正在使用pester(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中重建纠缠器之外的测试设置和结构——这是一个痛苦的过程。
如果有人对如何获得我的产出有任何建议,我将不胜感激。
谢谢,
David
答案似乎是设置$VerboseReference="继续";在脚本中
例如
$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}
我找不到任何配置选项来显示我在控制台上看到的相同内容,所以我使用PassThru和for循环打印之后的所有测试输出:
$(Invoke-pester -PassThru).Tests | ForEach-Object -Process {"-"*80;$_.Result + ": " + $_.Name;"-"*80;$_.StandardOutput}