http://qs321.pair.com?node_id=843962

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

package Test_Package; use strict; sub testing { print "okay"; }; 1; ------------------------- #!/usr/bin/perl use strict; use lib qw( c:\ ); use Test::More tests => 1; use Test_Package; ok( Test_Package->testing() eq 'okay', 'Testing okay');
When I run this script, it says that the test fails.

This is a stripped down script and package. Basically, I want to test the method Test_Package->testing() so that I know what it prints on the screen is the same as what I would expect.

Unfortunately, the output of the subroutine goes to the standard output and so I am not sure how to capture it so that I can test it.

Also, I do not wish to change anything in the package, but I can do any modification on the script.

Thanks in advance.

Replies are listed 'Best First'.
Re: How to Test Output from the Standard Output
by GrandFather (Saint) on Jun 10, 2010 at 03:28 UTC

    One way is to redirect stdout to a file. For this purpose it helps if the file is actually a Perl variable. Consider:

    package Test_Package; use strict; sub testing { print "okay."; }; 1; use strict; use Test::More tests => 1; my $log; open my $logFile, '>', \$log; my $oldStdOut = select $logFile; Test_Package->testing(); select $oldStdOut; close $logFile; is($log, 'okay', 'Testing okay');

    Prints:

    1..1 not ok 1 - Testing okay # Failed test 'Testing okay' # at ...\noname.pl line 25. # got: 'okay.' # expected: 'okay' # Looks like you failed 1 test of 1.

    The error is deliberate btw.

    True laziness is hard work
Re: How to Test Output from the Standard Output
by snoopy (Curate) on Jun 10, 2010 at 05:42 UTC
    See also Test::Output. This provides some utility functions to do exactly this.
    use strict; use Test::Output; use Test::More tests => 1; use Test_Package; stdout_is( sub{Test_Package->testing()}, 'okay', 'Testing okay');
      Test::Output is interesting, but I had to make a few adjustments to get it to work. I took Grandfather's script, added a test from Test::Output.
      package Test_Package; use strict; sub testing { print "okay"; }; 1; use strict; use Test::Output; use Test::More tests => 4; my $log; open my $logFile, '>', \$log; my $oldStdOut = select $logFile; Test_Package->testing(\$log); select $oldStdOut; close $logFile; stdout_is {print "okay"} "okay", "STDOUT okay"; is('okay', 'okay'); is($log, 'okay'); is($log, 'okay', 'testing okay');
Re: How to Test Output from the Standard Output
by DrHyde (Prior) on Jun 10, 2010 at 10:17 UTC
Re: How to Test Output from the Standard Output
by bichonfrise74 (Vicar) on Jun 10, 2010 at 21:32 UTC
    I was thinking of this same problem the other day as well. Guess I do not even have to ask for it anymore.