2012-04-16 4 views
3

私はmockmoduleを使ってforkを呼び出すことを試みています。私はこれをこのように設定しています...perl mockmodule fork

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

私のモジュールはFoo.pmです。私はテスト中のモジュールにロードされている他のモジュール呼び出しに関する経験を持っており、このようなモック・モジュール呼び出しはうまくいくようです。しかし、私のモックプリントステートメントには決して到達しません(実際のforkが呼び出されます)。

これはforkのようなシステムコールを模倣する正しい方法ですか?テスト対象のシステムとは別のモジュールをロードする必要がありますか?

+2

'鯉を使用してみてください::()'ではなく ')('プリントよりcluckと。これは、コードが呼び出された場合にスタックトレースを提供します。あなたが定義しているのは '$ modMock-> fork()'だと思いますが、それはあなたが望むものだとは思いません。 –

答えて

4

は、あなたのコードは、名前&Foo::forkにサブルーチン定義を割り当てている、とあなたは常に完全修飾関数名Foo::fork()を呼び出すかFoo名前空間にしながら、印章&forkを使用してそれを実行することができます。裸forkへの呼び出しは、あなたの関数の代わりに組み込み、「may be done only by importing the name from a module at compile time」を呼び出すように

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 

、組み込み関数のオーバーライド。それは完全に理解するのは難しいだった場合は、単に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