Как смоделировать IO :: Socket :: INET с помощью Test :: MockObject - PullRequest
3 голосов
/ 05 октября 2011

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

Sp, у меня есть что-то вроде

$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 Ответ

1 голос
/ 05 октября 2011

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