[tpm] testing; using eval to catch an error in a module

Michael Graham magog at the-wire.com
Sat Aug 29 11:33:42 PDT 2009


If you're trying to catch compile-time errors, you need to wrap the
'use' or 'require' in an eval as well:
    
    BEGIN {
        eval {
            require Some::Module;
        };
        if ($@) {
            print "The module could not be loaded: $@\n";
        }
    }


Perl has a highly evolved testing culture, and there are lots of
test-related modules on CPAN.  You'll be better off in the long run if
you learn how to do standard Perl testing, than if you reinvent the
wheel with one-off testing scripts.

The basic testing module is Test::More.  If you learn nothing else,
learn how to use Test::More.

Here's an (untested) Test::More-based script that does what you're 
doing by hand:


    #!/usr/bin/perl
    # save this as test.t

    use Test::More;

    BEGIN { use_ok('Some::Module'); }
    
    eval {
        $an->foo("some Illegal arg");
    };

    my $e = $@; 
    ok($e, "The module 'die'ed as planned and emitted error: $e");

    done_testing();


You run this with:

    $ prove test.t


There are other modules that add syntactic sugar for specific testing
scenarios.  In your case, you might look at Test::Exception:

    
    #!/usr/bin/perl

    use Test::Exception;

    BEGIN { use_ok('Some::Module'); }

    throws_ok { $an->foo("some Illegal arg") } 
        qr/that's an Illegal arg, you insensitive clod!/, 
        "The module 'die'ed as planned and emitted an error";


    done_testing();




Michael




On Sat, 29 Aug 2009 13:01:04 -0400
Madison Kelly <linux at alteeve.com> wrote:

> Hi all,
> 
>    I've been working on a test script for my module suite/hobby and
> I've been having a bit of trouble. I want to trap errors in the
> module without killing the test script. I was hoping I could do
> something like:
> 
> eval {
> 	$an->foo("some Illegal arg");
> }
> if ($@)
> {
> 	print "The module 'die'ed as planned and emitted error:
> [$@]\n"; }
> else
> {
> 	die "Testing of module death failed as [$@] wasn't set.\n";
> }
> 
> I think this is because it's not a compile time error, but the
> perldoc for eval shows trapping for a divide by zero error, which as
> I understand it would trigger on execution, not compile.
> 
> Am I missing something fundamental? Should I be approaching my
> testing in a different way?
> 
> I'm sorry is this is a simple question... I've been trying to make
> sure I've got a good handle on a lot of perl topics recently and am
> starting to get a wee blender-brain.
> 
> Thanks!
> 
> Madi
> _______________________________________________
> toronto-pm mailing list
> toronto-pm at pm.org
> http://mail.pm.org/mailman/listinfo/toronto-pm


More information about the toronto-pm mailing list