3

モックモジュールを使用して fork の呼び出しをモックしようとしています。こんな感じに設定してます…

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

私のモジュールはFoo.pmです。私は他のモジュール呼び出しがテスト対象のモジュールにロードされる経験があり、このようなモジュール呼び出しのモックはうまく機能しているようです。ただし、私の疑似印刷ステートメントには到達しません (実際のフォークが呼び出されます)。

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

4

1 に答える 1

4

あなたのコードはサブルーチン定義を name に割り当てており、名前空間内で完全修飾関数名を呼び出すか、シジルを使用&Foo::forkすることでいつでも実行できます。Foo::fork()&forkFoo

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

組み込み関数をオーバーライドして、bare のfork呼び出しが組み込み関数の代わりに関数を呼び出すようにすることは、"コンパイル時にモジュールから名前をインポートすることによってのみ行うことができます"。それが難しかった場合は、プラグマが次の条件を満たしていることを知って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
于 2012-04-17T15:52:19.957 に答える