首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型跟踪模拟类

泛型跟踪模拟类
EN

Stack Overflow用户
提问于 2015-01-27 15:22:27
回答 1查看 50关注 0票数 0

我正在尝试使用moops构建一个方便的模拟类:

代码语言:javascript
复制
#!/usr/bin/env perl
use Modern::Perl '2014';
use Moops;
use Test::More;

class aClass {
  method m {}
  method l {}
};

class NotWorkingMockAClass
extends aClass {

  has methodCallLog => (
    is  => 'rw',
    default => sub { [] },
    isa     => ArrayRef
  );

  around m, l {
    push $self->methodCallLog, (caller(0))[3] =~ m/::(\w+)$/;
    $next->($self, @_ );
  }

};

my $mac = NotWorkingMockAClass->new();
$mac->m();
$mac->l();
$mac->m();

is( ($mac->methodCallLog)->[0], 'm', 'mcl[0] == m' );
is( ($mac->methodCallLog)->[1], 'l', 'mcl[1] == l' );
is( ($mac->methodCallLog)->[2], 'm', 'mcl[2] == m' );

这产生了:

代码语言:javascript
复制
$ perl mocking.pl 
ok 1 - mcl[0] == m
not ok 2 - mcl[1] == l
#   Failed test 'mcl[1] == l'
#   at mocking.pl line 33.
#          got: 'm'
#     expected: 'l'
ok 3 - mcl[2] == m

因此,问题似乎是,当我使用caller()快捷方式时,m总是返回around m,l ..

类的定义如下:

代码语言:javascript
复制
class WorkingMockAClass
extends aClass {

  has methodCallLog => (
    is  => 'rw',
    default => sub { [] },
    isa     => ArrayRef
  );

  method _logAndDispatch( CodeRef $next, ArrayRef $args ){
    push $self->methodCallLog, (caller(1))[3] =~ m/::(\w)$/;
    $next->($self, @$args );
  }
  around m {
    $self->_logAndDispatch( $next, \@_ );
  }

  around l {
    $self->_logAndDispatch( $next, \@_ );
  }
};

可以工作,但是编写起来有点冗长和繁琐。

有更好的选择来实现这样的目标吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-28 23:01:11

就我个人而言,无论是Moops还是其他方面,我都不相信caller有任何可能会应用修饰符的方法。我也不相信这些修饰语。您太依赖于方法修饰符的内部结构。(Moo/Moose/老鼠之间会有不同。)

你试过这样的东西吗?

代码语言:javascript
复制
push @{ $self->methodCallLog }, Sub::Identify::sub_name($next);

(或者使用Sub::Util代替Sub::标识)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28173912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档