#!/usr/bin/perl -w use warnings; use strict; use feature qw(switch say); use NaServer; my $session = NaServer->new(); my $val = $session->get_val(); if ($val > 500 ) { say 'Value to high: ' . $val; exit 2; } else { say "Value OK ($val)"; exit 0; } #### package NaServer; # this is just a dummy version of NetApps NaServer !! use strict; use warnings; use Carp; sub new { my $class = shift; my $self = {}; bless \$self, $class; } sub get_val { return rand 1000; } 1; #### #!/usr/bin/perl -w use warnings; use strict; use feature qw(switch say); use Test::More tests => 3; use Test::MockObject; use Test::Output; my $mock = Test::MockObject->new(); $mock->fake_module ('NaServer', new => sub { return 'NaServer' }, get_val => sub { return 500 }, ); use_ok( 'NaServer' ) or exit; ## includes 'use NaServer;' # Construction of $s just for testing my $s = NaServer->new( 'sim8aXXXXXX', 1, 6 ); isa_ok( $s, 'NaServer'); # ================================== # = Tests of the script start here = # ================================== use File::Slurp; my $script = 'script_to_test.pl'; eval 'package Script; sub test {' . read_file($script) . '}'; stdout_is { Script::test() } qq{Value OK (500)\n}, 'stdout as expected'; __END__ ## This does not work as expected, since the test stdout_is is never reached. ## Exits in script_to_test.pl prevent this. #### #!/usr/bin/perl -w use warnings; use strict; use feature qw(switch say); use Test::More tests => 3; use Test::MockObject; my $mock = Test::MockObject->new(); $mock->fake_module ('NaServer', new => sub { return 'NaServer' }, get_val => sub { return 500 }, ); use_ok( 'NaServer' ) or exit; ## includes 'use NaServer;' # Construction of $s just for testing my $s = NaServer->new( 'sim8aXXXXXX', 1, 6 ); isa_ok( $s, 'NaServer'); # ================================== # = Tests of the script start here = # ================================== use Test::Trap; use File::Slurp; my $script = 'script_to_test.pl'; my @r = trap { eval read_file($script) }; is ($trap->stdout, "Value OK (500)\n", 'stdout as expected'); __END__ # This works fine, traping after having mocked the NaServer was the trick. # Thanks to the monks!