3

我正在尝试使用 mockmodule 模拟对 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,您始终可以通过调用完全限定的函数 name或在命名空间中Foo::fork()使用 sigil 来执行它。&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

覆盖内置函数,以便调用 barefork调用您的函数而不是内置函数,“只能通过在编译时从模块导入名称来完成”。如果这很难理解,只需知道subspragma 满足您的这个条件:

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 回答