in reply to Re: Checking parameters passed to a third party module during testing (wrap)
in thread Checking parameters passed to a third party module during testing

I thought I had this working earlier today, did something else for a while, then when I came back to it found that the call in the replacement sub is calling itself. The code below demonstrates the problm:

use strict; use warnings; use Test::More tests => 1; my $new; BEGIN { require MIME::Lite; $new = MIME::Lite->can ("new"); undef &MIME::Lite::new; } sub MIME::Lite::new { print "Validating MIME::Lite::new params\n"; #goto $new; #return $new->(@_); return &$new; } ok (checkSub (), 'Match existing path'); sub checkSub { my $msg = MIME::Lite->new ((To => 'to', )); my $result = eval {$msg->send}; }

For my current tests it's not essential that the original code be called so I can simply return a success value. However that will not always be appropriate. Any idea what I am doing wrong?

None of the "return" variants affect the behaviour.

r
DWIM is Perl's answer to Gödel
  • Comment on Re^2: Checking parameters passed to a third party module during testing (wrap)
  • Download Code

Replies are listed 'Best First'.
Re^3: Checking parameters passed to a third party module during testing (wrap)
by ammon (Sexton) on Oct 19, 2006 at 19:14 UTC
    I'm not 100% sure I can explain what's going on, but the good news is that it's easily fixed. :)

    use strict; use warnings; use Test::More tests => 1; my $new; BEGIN { require MIME::Lite; $new = MIME::Lite->can ("new"); no warnings 'redefine'; *MIME::Lite::new = \&MIME_Lite_new_wrapper; } sub MIME_Lite_new_wrapper { print "Validating MIME::Lite::new params\n"; goto $new; } ok (checkSub (), 'Match existing path'); sub checkSub { my $msg = MIME::Lite->new ((To => 'to', )); my $result = eval {$msg->send}; }

    In your original code, you're redefining MIME::Lite::new(). I'm leaving that function alone, creating a new function, MIME_LITE_new_wrapper(), and then updating the symbol table (*MIME::Lite::new{CODE}) to point to my function. In that way, perl doesn't redefine MIME::Lite::new() to your local sub.

    I don't know enough about the perl guts to understand why the reference to the original in $new isn't sufficient to maintain the original code definition.

    Perhaps someone with more of a clue can chime in. Most of my knowledge of this stuff is cobbled together from perldoc perlref, old posts on c.l.p.m, and looking at the code of various modules that do tricky things with symbol tables.

    Cheers,