perl mockmodule fork

3

我正在尝试使用mockmodule模拟对fork的调用。我将其设置如下...

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

我的模块名为Foo.pm。我之前有过其他模块调用被加载到正在测试的模块中,通过模拟模块调用来解决这个问题似乎很有效。然而,我的模拟打印语句从未被执行(实际的fork被调用了)。

这是模拟系统调用(如fork)的正确方法吗?我应该加载不同于被测试系统的模块吗?


2
尝试使用Carp::cluck()而不是print()。如果代码被调用,这将为您提供堆栈跟踪。话虽如此,我认为您定义的是$modMock->fork(),我认为那不是您想要的。 - Barton Chittenden
1个回答

4

您的代码将子程序定义分配给名称&Foo::fork,您可以通过调用完全限定的函数名称Foo::fork()或在Foo命名空间中使用符号&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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接