如何使用Test :: MockModule在函数前附加一些逻辑?

时间:2011-09-21 08:42:10

标签: perl

这是我正在使用的模拟模块:

http://metacpan.org/pod/Test::MockModule

如何模仿sub asub b

sub b在调用sub a之前只做其他事情?

sub b {
  #do something else
  a(@_);
}

1 个答案:

答案 0 :(得分:3)

您可以使用canUNIVERSAL::can)获取未模拟的方法。之后你可以goto或者只是使用&符号调用样式来传递相同的参数。这就是我在下面所做的。

 my $old_a = Package::To::Be::Mocked->can( 'a' );
 $pkg->mock( a => sub { 
      # do some stuff
      &$old_a;
 });

当然,这假定您的子邮件不是AUTOLOAD或通过AUTOLOAD生成而不重新定义can。 (我多年前就知道,如果你要弄AUTOLOAD,最好在can中完成工作。)

您还可以创建自己的实用程序,通过 invading 修改Test::MockModule的命名空间来自动执行此操作。

{   package Test::MockModule;
    sub modify {
        my ( $self, $name, $modfunc ) = @_;
        my $mock_class = $self->get_package();
        my $old_meth = $mock_class->can( $name );
        croak( "Method $name not defined for $mock_class!" ) unless $old_meth;
        return $self->mock( $name => $modfunc->( $old_meth ));
    }
}

你可以这样称呼它:

$mock->modify( a => sub { 
    my $old_a = shift;
    return sub { 
        my ( $self ) = @_;
        # my stuff and I can mess with $self
        local $Carp::CarpLevel += 1;
        my @returns = &$old_a;
        # do stuff with returns
        return @returns;
    };
});