Как смоделировать IO::Socket::INET с помощью Test::MockObject

Я пишу некоторые модульные тесты для модуля Perl, который использует IO::Socket::INET, поэтому я хотел бы смоделировать модуль IO::Socket::INET, используя Test::MockObject.

Зр у меня что то типа

$INC{'IO/Socket/INET.pm'} = 1;
my $inet = Test::MockObject->new();
$inet->fake_module('IO::Socket::INET', new => sub { $inet });

но код в модуле, который я тестирую, имеет такой код

my $server = IO::Socket::INET->new(...);
my $data = <$server>

и когда я запускаю тест, я получаю сообщение об ошибке типа "Не ссылка GLOB", когда оно пытается выполнить оператор угла.

Что мне нужно добавить, чтобы моя ссылка на фиктивный объект выглядела как дескриптор файла, чтобы этот код выполнялся?

1 ответ

Вы можете использовать перегрузку, чтобы создать свой собственный фиктивный класс INET, который будет обеспечивать собственную реализацию <> оператор. Что-то вроде следующего:

package My::MockINET;

use strict;
use warnings;

use overload '<>' => \&_readline;

sub new { 
    return bless { }, shift;
}

sub _readline { 
    return "some data here\n";
}

1;

Тогда вы можете использовать его как:

$INC{'IO/Socket/INET.pm'} = 1;
my $inet = My::MockINET->new();

my $data = <$inet>;
Другие вопросы по тегам