【问题标题】:Perl Unit Test MockingPerl 单元测试模拟
【发布时间】:2015-11-19 21:02:30
【问题描述】:

我正在尝试通过模拟在 Perl 中编写单元测试。这是我第一次尝试嘲笑。

方法在 MyConnect.pm 中定义

sub connect_attempt {
my ($a, $b, $c) = @_; 
// some calculation with $c
$status = connect( $a, $b );
return status;
}

connect 是 Socket 模块中定义的子程序。我需要测试两个场景

1) 连接成功 - 为了测试这一点,我计划返回一个新的模拟对象或字符串
2) 连接不成功 - 状态将保持未定义

MyConnect.t

use MyConnect;
use Socket;
my $status;
my $mock = Test::MockObject->new();
my $connect_module = Test::MockModule->new('MyConnect');
$connect_module->mock( 'connect_attempt' => sub { return "true"});
my $socket_module = Test::MockModule->new('Socket');
$socket_module->mock( 'connect' => sub { return "true"});
$status = $connect_module->connect_attempt("122", "53", 0);
ok(defined $status, 'Its fine');

我收到以下错误:

Cant locate object method "connect_attempt" via package "Test::MockModule" at t/MyConnect.t line 21.
#Looks like your test exited with 9 before it could output anything.
Dubious, test returned 9 (wstat 2304, 0x900)`
Line 21 is the call `$status = connect_attempt("122", "53", 0);

据我了解,我已经为我的 Module(MyConnect) 和 Socket 模块创建了 MockModule,因为我将从它调用连接子例程。 我已将两个子程序的响应设置为 true。我也应该期待 $status 为真。

谁能解释我哪里出错了。这是我的第一个模拟单元测试。我可能误解了某些概念。

谢谢

【问题讨论】:

    标签: perl unit-testing testing mocking


    【解决方案1】:

    我相信这是因为您正在使用模块的面向对象用法,但您的原始模块不是 OO。

    变化:

    $status = $connect_module->connect_attempt("122", "53", 0);
    

    ...到:

    $status = MyConnect::connect_attempt("122", "53", 0);
    

    ...或者,将您的 MyConnect 更改为 OO:

    package MyConnect;
    
    sub new {
        return bless {}, shift;
    }
    
    sub connect_attempt {
        my ($a, $b, $c) = @_;
        $status = connect( $a, $b );
        return status;
    }
    1;
    

    ...然后改变这个:

    $status = $connect_module->connect_attempt("122", "53", 0);
    

    ...到这个:

    my $mocked_myconnect = MyConnect->new;
    $status = $mocked_myconnect->connect_attempt("122", "53", 0);
    

    【讨论】:

    • 我选择了您建议的第一个选项。但是,似乎 connect 似乎没有返回模拟值。它实际上是在调用主机参数。连接方法的模拟是否正确完成?谢谢
    猜你喜欢
    • 2011-10-04
    • 2013-02-22
    • 2011-04-11
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    相关资源
    最近更新 更多