perl mockmodule fork

时间:2012-04-16 23:00:18

标签: perl mocking fork

我正在尝试使用mockmodule模拟对fork的调用。我正在这样设置......

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

我的模块是Foo.pm.我已经有过将其他模块调用加载到被测模块中的经验,而像这样的模拟模块调用似乎运行良好。但是,我的模拟打印语句永远不会到达(并且会调用真正的fork)。

这是模拟像fork这样的系统调用的正确方法吗?我应该加载与被测系统不同的模块吗?

1 个答案:

答案 0 :(得分:4)

您的代码正在为名称&Foo::fork分配子例程定义,您始终可以通过调用完全限定的函数名Foo::fork()或使用sigil &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 pragma满足你的条件:

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