Perl 如何使用Test::MockModule在函数之前附加一些逻辑?
这是我正在使用的模拟模块: 如何模拟Perl 如何使用Test::MockModule在函数之前附加一些逻辑?,perl,Perl,这是我正在使用的模拟模块: 如何模拟子a到子b 其中sub-b在调用sub-a之前只执行其他操作 sub b { #do something else a(@_); } 您可以使用can(UNIVERSAL::can)获取未模拟的方法。之后,您可以gotoit,也可以使用符号和调用样式传递相同的参数。下面我就是这么做的 my $old_a = Package::To::Be::Mocked->can( 'a' ); $pkg->mock( a => sub {
子a
到子b
其中sub-b
在调用sub-a
之前只执行其他操作
sub b {
#do something else
a(@_);
}
您可以使用
can
(UNIVERSAL::can
)获取未模拟的方法。之后,您可以goto
it,也可以使用符号和调用样式传递相同的参数。下面我就是这么做的
my $old_a = Package::To::Be::Mocked->can( 'a' );
$pkg->mock( a => sub {
# do some stuff
&$old_a;
});
当然,这假设您的sub不是自动加载
,也不是通过自动加载
生成的,而无需重新定义can
。(几年前我就知道,如果你想搞砸自动加载
,最好是在can
中完成这项工作)
您还可以通过修改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;
};
});
您可以使用
can
(UNIVERSAL::can
)获取未模拟的方法。之后,您可以goto
it,也可以使用符号和调用样式传递相同的参数。下面我就是这么做的
my $old_a = Package::To::Be::Mocked->can( 'a' );
$pkg->mock( a => sub {
# do some stuff
&$old_a;
});
当然,这假设您的sub不是自动加载
,也不是通过自动加载
生成的,而无需重新定义can
。(几年前我就知道,如果你想搞砸自动加载
,最好是在can
中完成这项工作)
您还可以通过修改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;
};
});
如何模拟继承的functin?@new_perl,如果您只是想覆盖父类中定义的行为,mock应该可以
can
返回一个对它分派给的sub的引用——如果使用默认can或者程序员知道他或她在做什么。因此,modify
也应该可以工作,但是如果您只是想覆盖父函数,您也可以使用标准的$self->SUPER::a(@)
(只要$self
已从“组”中移出)。如何模拟继承的functin?@new\u perl,如果您只是想覆盖父类中定义的行为,mock应该适用于此can
返回一个对它分派给的sub的引用——如果使用默认can或者程序员知道他或她在做什么。因此,modify
也应该可以工作,但是如果您只是想覆盖父函数,您也可以使用标准的$self->SUPER::a(@)代码>(只要已将$self
从“甲板”移走即可)