2011-10-05 88 views
2

我正在爲使用IO :: Socket :: INET的Perl模塊編寫一些單元測試,所以我想模擬IO: :使用Test :: MockObject的Socket :: INET模塊。如何使用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> 

代碼,當我運行測試,我得到一個錯誤,如「不一個GLOB參考「當它試圖執行角度操作符。

我需要添加什麼來使我的模擬對象引用看起來像一個文件句柄,以便此代碼運行?

回答

0

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

,謝謝,我已經找到一種方法與測試:: MockObject做到這一點了。您可以將glob引用傳遞給MockObject構造函數,因此我使用open(FH,「<」,\ $ scalar)創建文件句柄,然後將\\ * FH傳遞給MockObject-> new()。模擬對象的行爲就像一個文件句柄。 –