2010-03-01 53 views
2

我有一個定義了use overload '""' => \&name;name方法的Perl對象。如何在Perl中模擬一個對象?

在我的單元測試我都嘲笑這個對象,包括name方法,但類似的代碼

if (-d $object) 

仍然給我Use of uninitialized value in -d ...。模擬的方法沒有被執行。

我的模擬代碼:我已經嘲笑正在

my $CMmock = Test::MockObject::Extends->new('MyClass'); 
$CMmock->mock('name', sub { print "TEST!\n";});  
$CMmock->mock('""', sub {print "TEST!\n";}); 

其他方法。

+2

參見:http://stackoverflow.com/questions/1954529/perl-mocking-df-and-friends-how-to-put-them-into-coreglobal – mob 2010-03-01 16:14:15

+0

有趣問題,但請在嘲笑超載類的問題上提出恰當的問題。 – darch 2010-03-02 09:04:56

+0

感謝mobrule,那個鏈接解決了我的問題。可惜我在搜索時沒有找到它。 – Fredrik 2010-03-02 12:31:05

回答

0

[過於複雜的答案涉及串evals省略。]

overload保持什麼樣的重載是一個神奇的地方效果的想法。有時候,特別是動態生成的類,它沒有注意到變化。你可以通過祝福課堂上新鮮的東西來強迫它注意。您可以立即丟棄該對象;祝福事件是重要的。你甚至不必在任何地方存儲對象。對我來說,以下工作:

use Scalar::Util qw(blessed); 

my $o = Test::MockObject::Extends->new('MyClass') 
     ->mock(name => sub { "Bah!" }) 
; 
bless {} => blessed $o; 

print "$o\n"; 
+0

但是,我想指出的是,涉及字符串evals的過於複雜的答案非常棒。 – darch 2010-03-02 08:55:44

+0

感謝您的回答。但這對我不起作用。我可能很難說這個問題。除了「-f」和「-d」操作符之外,實際的嘲笑對我來說很有效。從「moombule」相關的問題來看,似乎這些運營商根本不會被嘲笑。 我可能會用一個解決方案,用一些IO :: File操作和模擬IO :: File替換「-d」/「 - f」,或者創建一個像「isFile {shift -f;}」的方法,並且相反,嘲笑。 – Fredrik 2010-03-02 12:29:58