从 pester 测试输出调试信息

问题描述

我正在用 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}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...