【发布时间】: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