在不更改代码但添加测试的情况下很好
要测试的代码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
答案 0 :(得分:4)
您的问题是您将文件名用作裸字,因此Perl将其解释为程序包名称。由于.
不是合法的标识符字符(可以在包名称中使用的字符),因此会收到该警告。
如果要使用文件名,请使用字符串代替:
require 'file.pl';
然后,在对Test::MockModule
的调用中,将使用您在 file.pl 中定义的包的名称,而不是文件名。
我不知道您在做什么,但是当我要替换子例程定义时,我将其覆盖。这是这个想法的核心,有一些方法可以暂时做到。接口Test::MockModule
和Hook::LexWrap
后面的代码并不那么复杂:
BEGIN {
require 'file.pl';
package Some::Package;
no warnings 'redefine';
*get_name = sub { ... }
}
全局(*get_name
)有点棘手,但是您的示例中已经显示了几乎所有其他内容。我在Effective Perl Programming中展示了一些技巧。对于我的工作,减少模块依赖性列表(尤其是在测试中)通常是值得的高级技巧。