如何使用Test :: MockObject模拟IO :: Socket :: INET

时间:2011-10-05 14:21:59

标签: perl unit-testing

我正在为使用IO :: Socket :: INET的Perl模块编写一些单元测试,所以我想使用Test :: MockObject模拟IO :: Socket :: INET模块。

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>

当我运行测试时,我在尝试执行角度运算符时遇到类似“Not a GLOB reference”的错误。

我需要添加什么才能使我的模拟对象引用看起来像文件句柄,以便运行此代码?

1 个答案:

答案 0 :(得分:1)

您可以使用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>;