Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

How to Test Output from the Standard Output

by Anonymous Monk
on Jun 10, 2010 at 03:21 UTC ( #843962=perlquestion: print w/ replies, xml ) Need Help??
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.

Comment on How to Test Output from the Standard Output
Download Code
Re: How to Test Output from the Standard Output
by GrandFather (Cardinal) 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 (Deacon) 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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://843962]
Approved by sflitman
Front-paged by DrHyde
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (8)
As of 2014-12-25 06:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (159 votes), past polls