2012-04-16 52 views
3

我試圖用mockmodule來模擬對fork的調用。我正在設置它像這樣...perl mockmodule fork

my $mock = Test::MockModule->new('Foo'); 
$modMock->mock(fork => sub { print "here"; return 0; }); 

其中我的模塊是Foo.pm.我有過其他模塊調用的經驗,可以加載到被測模塊中,模擬這種模塊調用似乎很有效。但是,我的模擬打印語句從未達到(並且調用真正的分支)。

這是模擬像fork這樣的系統調用的正確方法嗎?我應該加載與被測系統不同的模塊嗎?

+2

嘗試使用'鯉魚::咕咕()'而不是'的print()'。如果代碼被調用,這會給你一個堆棧跟蹤。話雖如此,我認爲你所定義的是'$ modMock-> fork()',我不認爲這就是你想要的。 – 2012-04-17 00:00:39

回答

4

您的代碼分配一個子程序定義的名稱&Foo::fork,你可以隨時通過調用完全限定函數名Foo::fork()或使用印記&fork而在Foo命名空間中執行它。

package Foo; 
TestModule->new('Foo')->mock(fork => sub { ... }); 

Foo::fork;    # calls mocked function 
⋔     # calls mocked function 
{ package Bar; &fork } # error: no &Bar::fork 
fork;     # calls builtin 

重寫內置函數,使得對裸fork呼叫調用你的函數,而不是內置的「may be done only by importing the name from a module at compile time」。如果這是很難神交,只知道subs編譯滿足這個條件你:

package Foo; 
use subs 'fork'; # compile-time import of name 'fork' 
TestModule->new('Foo')->mock(fork => sub { ... }); 

Foo::fork;    # calls mocked function 
⋔     # calls mocked function 
fork;     # now calls mocked function 
{ package Bar; fork; } # calls builtin 
CORE::fork;   # always calls builtin