in reply to Re: Trapping exit AND using mocked objects?
in thread Trapping exit AND using mocked objects?

Your comments both in the CB and here helped to find the solution. Following the code which should clearly demonstrate both the the problem and the solution. Thanks for your help!

script_to_test.pl

#!/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; }

NaServer.pm - Dummy Module

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;

eval.t (this did not work)

#!/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 expect +ed'; __END__ ## This does not work as expected, since the test stdout_is is never r +eached. ## Exits in script_to_test.pl prevent this.

trap.t (this one works)

#!/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 tr +ick. # Thanks to the monks!