perl模拟模块叉

perl模拟模块叉,perl,mocking,fork,Perl,Mocking,Fork,我正在尝试使用mockmodule模拟对fork的调用。我是这样设置的 my $mock = Test::MockModule->new('Foo'); $modMock->mock(fork => sub { print "here"; return 0; }); 我的模块是Foo.pm。我有过将其他模块调用加载到被测模块中的经验,像这样模拟模块调用似乎效果不错。但是,我的mock print语句从未到达(并且调用了真正的fork) 这是模拟fork之类的系统调用的正确方法

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

my $mock = Test::MockModule->new('Foo');
$modMock->mock(fork => sub { print "here"; return 0; });
我的模块是Foo.pm。我有过将其他模块调用加载到被测模块中的经验,像这样模拟模块调用似乎效果不错。但是,我的mock print语句从未到达(并且调用了真正的fork)


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

您的代码正在为名称
&Foo::fork
分配一个子例程定义,您可以始终通过调用完全限定的函数名
Foo::fork()
或在
Foo
命名空间中使用sigil
&fork
来执行它

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
的调用调用您的函数,而不是内置的“.”。如果这很难理解,只需知道
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
尝试使用
Carp::cluck()
而不是
print()
。如果调用代码,这将为您提供堆栈跟踪。话虽如此,我认为您定义的是
$modMock->fork()
,我认为这不是您想要的。