我继承了一个我正在测试问题的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,这个方法会抛出异常。这是因为如果你稍后调用构造函数,你可能不会得到一个模拟对象,你会感到困惑。
我不确定我是否理解此消息以及如何使我的测试工作。
有人可以帮助我吗?
由于
答案 0 :(得分:2)
在评论中解决:
我能够通过在调用我的use_ok调用的BEGIN块之前将上面的代码放在一个单独的BEGIN块中来解决我的问题。这有什么问题吗? - 马克
即使在解析包含文件(或字符串)的其余部分之前,也会尽快执行BEGIN
代码块,即完全定义的代码块。
如果失败的use_ok
方法在BEGIN
块中并且它依赖于其他变量,那么那些因变量也需要在BEGIN
块中初始化或者它们<{1}}被召唤时会暂时undef
。
有关详细信息,请参阅:BEGIN, UNITCHECK, CHECK, INIT and END