如何在file.pl而不是模块中模拟func

时间:2019-09-24 16:30:54

标签: unit-testing perl

在不更改代码但添加测试的情况下很好

要测试的代码thefile.pl

get_name{
    return 'sth';
}

测试test_thefile.t

use Test::More;
use Test::MockModule;
require thefile.pl
my $module = Test::MockModule->new('thefile.pl')
$module->mock(get_name => sub { return 'othername' });
my $name = get_name();
ok($name eq 'othername');

我知道了

Invalid package name thefile.pl

1 个答案:

答案 0 :(得分:4)

您的问题是您将文件名用作裸字,因此Perl将其解释为程序包名称。由于.不是合法的标识符字符(可以在包名称中使用的字符),因此会收到该警告。

如果要使用文件名,请使用字符串代替:

require 'file.pl';

然后,在对Test::MockModule的调用中,将使用您在 file.pl 中定义的包的名称,而不是文件名。

我不知道您在做什么,但是当我要替换子例程定义时,我将其覆盖。这是这个想法的核心,有一些方法可以暂时做到。接口Test::MockModuleHook::LexWrap后面的代码并不那么复杂:

BEGIN {
    require 'file.pl';

    package Some::Package;
    no warnings 'redefine';
    *get_name = sub { ... }
    }

全局(*get_name)有点棘手,但是您的示例中已经显示了几乎所有其他内容。我在Effective Perl Programming中展示了一些技巧。对于我的工作,减少模块依赖性列表(尤其是在测试中)通常是值得的高级技巧。