使用Test :: MockObject-> fake_module时出现错误消息

时间:2014-08-11 16:08:20

标签: perl testing mocking

我继承了一个我正在测试问题的perl项目。有现有的测试,其中一个使用Test :: MockObject-> fake_module函数。此测试现在通过。但是,如果我为其他测试模块添加一个use(或use_ok)(在不同的测试中也可以正常工作),我会得到以下结果:

  

加载模块'IO :: File'

没有模拟子程序

在有问题的测试中,我们有:

my $io_file_mock = Test::MockObject->new();
$io_file_mock->set_isa('IO::File', 'IO::Handle');
$io_file_mock->set_true('flush', 'print');
$io_file_mock->fake_module('IO::File');
$io_file_mock->fake_new('IO::File');

我在MockObject-> fake_module的文档中看到这是写的:

  

如果你使用fake_module()来模拟已经存在于内存中的模块 - 也许你已经在别处加载了一个模块,但是没有将任何子程序传递给mock,这个方法会抛出异常。这是因为如果你稍后调用构造函数,你可能不会得到一个模拟对象,你会感到困惑。

我不确定我是否理解此消息以及如何使我的测试工作。

有人可以帮助我吗?

由于

1 个答案:

答案 0 :(得分:2)

在评论中解决:

  

我能够通过在调用我的use_ok调用的BEGIN块之前将上面的代码放在一个单独的BEGIN块中来解决我的问题。这有什么问题吗? - 马克

即使在解析包含文件(或字符串)的其余部分之前,也会尽快执行BEGIN代码块,即完全定义的代码块。

如果失败的use_ok方法在BEGIN块中并且它依赖于其他变量,那么那些因变量也需要在BEGIN块中初始化或者它们<{1}}被召唤时会暂时undef

有关详细信息,请参阅:BEGIN, UNITCHECK, CHECK, INIT and END