2011-02-25 61 views
7

我在我的一些测试中使用了MockObjects,并且只能通过调用SUPER类来测试一个函数,而我似乎无法使其工作。 UNIVERSAL调用像$ this-> SUPER :: save()不会被模拟吗?如果是的话,你是如何做到的?在Perl中嘲笑超类调用(使用Test :: MockObject)

谢谢。

编辑:

发现它!

使用fake_moduleTest::MockObject

所以,让我们说你的基本模块它Some::Module,你的子程序作出$this->SUPER::save通话,使用

my $child_class_mockup = Test::MockObject->new(); 
$child_class_mockup->fake_module(
    'Some::Module', 
    save => sub() { return 1; } 
); 

离开开了两天的问题,以在接受这个答案之前得到关于这样做的不同方式/库的输入(如果SUPER呼叫有SUPER呼叫呢?)。

回答

2

查找对象的超类(或其中一个超类,因为Perl有多重继承)的名称,并在超类的包中定义调用save

举例来说,如果你有

package MyClass; 
use YourClass; 
our @ISA = qw(YourClass); # <-- name of superclass 
... 
sub foo { 
    my $self = shift; 
    ... 
    $self->SUPER::save(); # <--- want to mock this function in the test 
    ... 
} 

sub save { 
    # MyClass version of save method 
    ... 
} 

然后在您的测试脚本,你会说

no warnings 'redefine';  # optional, suppresses warning 

sub YourClass::save { 
    # mock function for $yourClassObj->save, but also 
    # a mock function for $myClassObj->SUPER::save 
    ... 
}