【问题标题】:How to mock IO::Socket::INET with Test::MockObject如何使用 Test::MockObject 模拟 IO::Socket::INET
【发布时间】:2011-10-05 23:30:51
【问题描述】:

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

Sp far 我有类似的东西

$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 引用”的错误。

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

【问题讨论】:

    标签: perl unit-testing


    【解决方案1】:

    您可以使用overload 制作您自己的模拟INET 类,该类将提供自己的&lt;&gt; 运算符实现。类似于以下内容:

    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>;
    

    【讨论】:

    • 谢谢,我现在找到了使用 Test::MockObject 的方法。您可以将全局引用传递给 MockObject 构造函数,因此我使用 open(FH, "new()。然后,模拟对象的行为类似于文件句柄。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 2015-01-27
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多