David Regan
David Regan

Reputation: 319

Output debug information from pester test

I'm writing a system in C# that has lots of features to test. One feature is a set of PowerShell custom cmdlets for managing my system.

I'm using pester (v5) to test my cmdlets and will have a lot of test cases for the many scenarios that I want to test.

I can use pester successfully but I can't get any debug output from the tests - only the test report. The test report is fine to see what's passing and failing but if I have a failure then I want to be able to output results that can give me the context of what is going wrong.

I've tried all the settings I can think of for PesterConfiguration to no avail, e.g.

$PesterPreference = [PesterConfiguration]::Default
#$PesterPreference.Output.Verbosity = "Diagnostic"
$PesterPreference.Debug.WriteDebugMessages = $true
#$PesterPreference.Debug.WriteDebugMessagesFrom = "*"

As an example, imagine I have a get-foo cmdlet that returns an object with a Thing property that should have a value of "Bar".

I can write a pester test to check this but I would like to be able to output the returned object as part of the test to see something like:

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"
  }
}

Without the ability to get output then I have to reconstruct the test setup and structure outside of pester directly in PowerShell - which is a painful process.

If anyone has any advice on how to get my output then I'd appreciate the advice.

Thanks,

David

Upvotes: 2

Views: 3161

Answers (3)

Víctor C.
Víctor C.

Reputation: 1

I couldn't find any configuration option to show the same I would see on the console so I'm using the PassThru and a for loop to print all the tests output afterwards:

$(Invoke-pester -PassThru).Tests | ForEach-Object -Process {"-"*80;$_.Result + ": " + $_.Name;"-"*80;$_.StandardOutput}

Upvotes: 0

Frode F.
Frode F.

Reputation: 54911

You can access StandardOutput per test by using the result-object you get with -PassThru. Demo:

# 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}

Upvotes: 0

David Regan
David Regan

Reputation: 319

The answer seems to be to set the $VerbosePreference="Continue" in the script

E.g.

$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"
  }
}

Will dump out the detail of $obj as expected. This also works with $DebugPreference, $InformationPeference etc.

Upvotes: 3

Related Questions