perl - 为什么 Perl 模数中断测试中的 'package' 关键字?

标签 perl testing modulino

假设有一个简单的 Perl 脚本 testme.pl,如下所示:

use strict;
use warnings;

sub testme {
        return 1;
}

1;

还有一个像这样的测试文件testme.t:

use strict;
use warnings;

use Test::More;
require_ok('testing.pl');
ok(testme());
done_testing();

运行 perl testme.t 似乎按预期工作,但是 http://www.perlmonks.org/bare/?node_id=537361https://stackoverflow.com/a/9134624/272387建议加个package行,所以我修改原脚本为:

use strict;
use warnings;
package My::Testing;

sub testme {
        return 1;
}

1;

现在测试失败了:

Undefined subroutine &main::testme called at testing.t

为什么会这样?

最佳答案

失败是因为您的 testme 子不再位于默认的 main 命名空间中,它现在位于 My::Testing 命名空间中(包裹)。您现在需要通过其全名 My::Testing::testme() 访问它。

main 中的标识符不需要显式指定它们的包,因为它是默认的,但这就是错误消息将其称为 main::testme 的原因.

(您还可以在 My::Testing 包中使用 Exporter,导出子程序,然后从您的测试脚本中导入作为将 sub 复制到测试脚本的命名空间中的一种方式。或者您可以将另一个 package My::Testing 命令放入测试脚本中,这样它就会在 My::Testing 中查找 默认命名空间。但将其引用为 My::Testing::testme() 是修复它的最简单方法,并且最清楚地说明了您收到的错误消息背后的原因。 )

关于perl - 为什么 Perl 模数中断测试中的 'package' 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33074449/

相关文章:

regex - 找到一个作为模式给出的行词另一个行词,awk,perl,sed,grep?

html - Perl 脚本不会运行;只在浏览器中显示实际代码

Perl闭包和正则表达式变量

java - 在带有 Java 的 Selenium 中使用 @Factory 注释后无法运行测试

perl - 如何在 TextMate 中运行专为证明表单而设计的测试 perl 脚本?

perl - 在 Perl 中将文件读入变量

ruby-on-rails - 如何在 Rails 功能测试中发送原始发布数据?

python - 为 Django URL Dispatcher 编写的测试不起作用

perl - 在 Perl 中,如何确定我的文件是作为模块使用还是作为脚本运行?

ruby - 如何在 ruby​​ 模块中包含单元测试?