这是我正在使用的模拟模块:
http://metacpan.org/pod/Test::MockModule
如何模仿sub a
到sub b
,
sub b
在调用sub a
之前只做其他事情?
sub b {
#do something else
a(@_);
}
答案 0 :(得分:3)
您可以使用can
(UNIVERSAL::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;
};
});