2015-11-19 82 views
0

我正在尝试用嘲讽在Perl中编写单元测试。这是我第一次嘲笑。Perl单元测试嘲讽

方法在MyConnect.pm

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

连接在插座模块定义子程序。我需要测试两个场景

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

按我的理解,我创建MockModul e为我的模块(MyConnect)和套接字模块,因为我将调用它的连接子例程。 我已经将这两个子例程的响应设置为true。我应该期待$状态为真。

有人可以解释我哪里出错了。这是我第一次嘲笑单元测试。我可能误解了某些概念。

感谢

回答

1

我相信这是因为你使用了模块的面向对象的用法,但你原来的模块是不是面向对象。

变化:

$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); 
+0

我选择了您建议的第一个选项。然而,它似乎连接似乎没有返回嘲笑的价值。它实际上是调用主机参数。连接方法的模拟是否正确完成? 谢谢 – learningMyWayThru