unit-testing - 如何在 thefile.pl 中模拟函数而不是模块

标签 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

最佳答案

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

如果您想使用文件名,请使用字符串:

require 'file.pl';

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

我不知道你在做什么,但是当我想替换子例程定义时,我只需覆盖它即可。这是核心思想,暂时有办法做到。 Test::MockModuleHook::LexWrap 等接口(interface)背后的代码并不复杂:

BEGIN {
    require 'file.pl';

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

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

关于unit-testing - 如何在 thefile.pl 中模拟函数而不是模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58084633/

相关文章:

unit-testing - 如何忽略代码覆盖率数据中生成的代码

c# - 对运行时命中应用程序的 API 调用进行单元测试的最佳方法

ruby - 如何使用 Test/Unit 检查 RuntimeError

Perl 目录、文件排序、带大小和日期的打印列表

在子例程中使用的 Perl 变量初始化错误

c - Perl 脚本什么时候需要在调用 `tzset` 之前调用 `localtime` ?

Perl , html 数据和以 utf-8 编码的字符

c# - 使用 Microsoft.CodeAnalysis.CSharp.Testing.XUnit.AnalyzerVerifier 测试 Roslyn 分析器时如何加载程序集?

c# - 在内存中模拟 LinqToSql 存储库以用于单元测试

perl - Perl 5.18+ 中的哈希合并方法受到哈希顺序随机化的影响吗?