perlfile-iodup

How can I test STDERR with Test::More?


I am writing some tests using Test::More, and one of the functions I'm testing prints to STDERR. I'd like to test the output to STDERR, but am a little unsure how to do this. I know I'm close. This works:

use strict;
use warnings;
use feature qw(say);

close STDERR;
open STDERR, ">", \my $error_string;

say STDERR "This is my message";
say qq(The \$error_string is equal to "$error_string");

This prints out:

The $error_string is equal to "This is my message
"

However, I don't want to close STDERR. I merely want to dup it.

I've tried this:

use strict;
use warnings;
use feature qw(say);

open my $error_fh, ">", my $error_string;
open STDERR, ">&", $error_fh;

say STDERR "This is my message";
close $error_fh;
say qq(The \$error_string is equal to "$error_string");

But, $error_string is blank.

What am I doing wrong?


Solution

  • For me, open STDERR, ">&", $error_fh (along with open STDERR, ">&" . fileno($error_fh)) does not return a true value. I think the >& mode might be a pretty direct syntactic sugar for a dup system call, which wouldn't work on a pseudo-filehandle like $error_fh.

    How about localizing STDERR?

    {
        local *STDERR = *$error_fh;
        say STDERR "something";
    }
    # STDERR restored