2011-02-25 44 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 
    ... 
}