Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何使用Test::MockModule在函数之前附加一些逻辑?_Perl - Fatal编程技术网

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
从“甲板”移走即可)