我正在尝试使用mockmodule模拟对fork的调用。我正在这样设置......
my $mock = Test::MockModule->new('Foo');
$modMock->mock(fork => sub { print "here"; return 0; });
我的模块是Foo.pm.我已经有过将其他模块调用加载到被测模块中的经验,而像这样的模拟模块调用似乎运行良好。但是,我的模拟打印语句永远不会到达(并且会调用真正的fork)。
这是模拟像fork这样的系统调用的正确方法吗?我应该加载与被测系统不同的模块吗?
答案 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