Насмешливые вызовы суперкласса в Perl (используя Test :: MockObject) - PullRequest
8 голосов
/ 25 февраля 2011

Я использую 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 был вызов SUPER?), Прежде чем принять этот ответ.

1 Ответ

2 голосов
/ 25 февраля 2011

Узнайте имя суперкласса объекта (или одного из суперклассов, поскольку 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
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...