The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

        Test-Wiretap - Listen in on a function

SYNOPSIS

        use Test::More tests => 3;
        use Test::Wiretap;

        {
          package InsultOMatic;
          sub insult {
            my ($class, $what) = @_;
            print "$what smells funny.\n";
            return 'stinky';
          }
        }

        my $tap = Test::Wiretap->new({
          name => 'InsultOMatic::insult',
          before => sub {
            print "Preparing for insult...\n";
          },
          after => sub {
            print "Insult complete!\n";
          },
        });

        InsultOMatic->insult('Limburger cheese');
        # prints:
        #  Preparing for insult...
        #  Limburger cheese smells funny.
        #  Insult complete!

        is( $tap->called, 1, "Insulted one thing" );
        is_deeply(
          $tap->method_args,
          [['Limburger cheese']],
          "Insulted cheese"
        );
        is_deeply(
          $tap->return_values,
          [['stinky']],
          "InsultOMatic agrees with me"
        );

CONSTRUCTOR

   use Test::Wiretap qw(wiretap);
   my $tap = wiretap 'package::method', sub { ... }, %args;

is equivalent to:

    use Test::Wiretap;
    my $rs = Test::Wiretap->new({
      name => 'package::method',
      before => sub { ... },
      %args,
    });

%args can contain any of the following named arguments:

name (required)

The name of the function which is to be monitored.

before (optional)

A code reference that will run before the tapped function. This function receives the same @_ as the tapped function does.

after (optional)

A code reference that will run after the tapped function. This function receives three arguments: a reference to the tapped function's argument list, a reference to the tapped function's return-values list, and a third parameter indicating the context in which the tapped function was called.

The third parameter is one of 'list', 'scalar', or 'void'.

That is, if you have: sub foo { map { $_ + 100 } @_ }

my $tap = Test::Wiretap->new({ name => 'main::foo', before => sub { ... }, after => sub { ... }, });

my @list = foo(1, 2, 3);

then the 'before' sub's @_ is (1, 2, 3), and the 'after' sub's @_ is ([1, 2, 3], [101, 102, 103], 'list').

capture (optional)

If true, arguments and return values will be captured. Arguments are available using the args, method_args, named_args, and named_method_args methods. See the Test::Resub documentation for details on those.

Default is not to capture arguments.

deep_copy (optional)

If true, a deep copy of all arguments and return values will be made. Otherwise, a shallow copy will be kept. This is useful if the tapped function modifies receives a reference to a data structure that it modifies, for example.

Default is to deeply copy arguments and return values.

METHODS

called

Returns the number of times the tapped subroutine/method was called. The reset method clears this data.

was_called

Returns the total number of times the tapped subroutine/method was called. This data is not cleared by the reset method.

not_called

Returns true if the tapped subroutine/method was never called. The reset method clears this data.

reset

Clears the called, not_called, return_values, and args data.

args, method_args, named_args, named_method_args

Returns data on how the replaced subroutine/method was invoked. See the Test::Resub documentation for details.

return_values

Returns a list of lists of the return values from the tapped function. Examples:

  sub foo { map { $_ + 100 } @_ }

  Invocations:                             C<return_values> returns:
  ----------------------------             -------------------------
    (none)                                   []
    foo(1, 2, 3)                             [[101, 102, 103]]
    foo(5); foo(6, 7)                        [[105], [106, 107]]
return_contexts
  sub bar { }

  Invocations:                             C<return_contexts> returns:
  ----------------------------             -------------------------
    foo();                                   ['void']
    $x = foo();                              ['scalar']
    @a = foo();                              ['list']
    $x = foo(); @a = foo(); foo();           ['scalar', 'list', 'void']

AUTHOR

AirWave Wireless, <cpan at airwave.com>

BUGS

Please report any bugs or feature requests to bug-test-wiretap at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test-Wiretap. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Test::Wiretap

You can also look for information at:

ACKNOWLEDGEMENTS

COPYRIGHT & LICENSE

Copyright 2008 AirWave Wireless, all rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.