Насмешливые вызовы суперкласса в Perl (используя Test::MockObject)
Я использую 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 ответ
Узнайте имя суперкласса объекта (или одного из суперклассов, поскольку 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
...
}