在Perl中模拟超类调用(使用Test :: MockObject)

时间:2011-02-25 00:52:50

标签: perl unit-testing inheritance

我在一些测试中使用MockObjects,只需要通过调用SUPER类来测试函数,我似乎无法使其工作。 UNIVERSAL可以调用$ this-> SUPER :: save()不被嘲笑吗?如果是的话,你是怎么做到的?

感谢。

编辑:

发现它!

使用fake_module

中的Test::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呼叫有超级呼叫?),那么

1 个答案:

答案 0 :(得分: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
    ...
}