unit-testing - PERL5LIB、@INC 和库优先级进行测试
问题描述
.pl
当or.pm
具有use lib
or时测试 perl 代码时,我在覆盖 perl lib 时遇到了一些困难unshift @INC
,我的问题是:
由于难以测试,因此在生产代码中使用
use lib
或在生产代码中是一个坏主意吗?也不能覆盖这些unshift @INC
。prove -lvr
代码test.pl
push @INC, '/push/inc/lowest_priority';
use lib "/top/priority/use/lib/second_priority";
unshift @INC, "/unshift/inc/lib/first_priority";
foreach my $inc (@INC){
print "INC=>$inc\n";
}
设置 perl 环境
export PERL5LIB=/export/PERL5LIB/env/lib:$PERL5LIB
的输出perl -I/cmd/Iinclude/lib/ test.pl
INC=>/unshift/inc/lib/first_priority
INC=>/top/priority/use/lib/second_priority
INC=>/cmd/Iinclude/lib/
INC=>/export/PERL5LIB/env/lib
INC=>/usr/local/lib64/perl5
INC=>/usr/local/share/perl5
INC=>/usr/lib64/perl5/vendor_perl
INC=>/usr/share/perl5/vendor_perl
INC=>/usr/lib64/perl5
INC=>/usr/share/perl5
INC=>/push/inc/lowest_priority
解决方案
除非我没有其他选择,否则我不会对路径进行硬编码。
通常,您不希望以其他方式对您可以提供给程序的内容进行硬编码,以便它可以响应它所处的任何环境,而不仅仅是您开发它的环境。这些环境之一可能是您的测试环境。
您可以从程序外部设置库搜索路径,这使其更加灵活。
而且,由于您对它们进行硬编码并在运行时添加它们,它们将出现在您之前设置的任何内容之后。以下是您的设置中发生的情况:
- 你从默认开始
@INC
。 - 你开始“运行”你的程序,你开始编译阶段。它在执行运行时语句之前编译整个程序。
- 在编译时,它遇到
use lib
并立即执行该 pragma。现在/top/priority/use/lib/second_priority
是初@INC
。 - 对于编译阶段的其余部分,
/top/priority/use/lib/second_priority
是@INC
. 这就是后续use
调用会查找内容的地方。 - 编译阶段结束,程序进入运行阶段。
- 它遇到
push
并执行它。现在/push/inc/lowest_priority
是 的最后一个元素@INC
。 - 它跳过了,
use lib
因为编译阶段处理了编译指示。 - 它遇到
unshift
并执行它。现在/unshift/inc/lib/first_priority
是 中的第一项@INC
。 - 随后
require
的调用(运行时功能)将/unshift/inc/lib/first_priority
首先查看。
我不知道您希望在哪里找到您希望加载的库,但您必须提供它的完整路径。lib/下可能有额外的目录,而您没有考虑到这一点。
推荐阅读
- c# - 无法调试在 Xamarin.Forms 中制作的 IOS 应用程序
- azure - adf 函数根据模式仅读取文件名的某些部分
- c# - Htmlagilitypack 获取所有节点,而不仅仅是 FirstOrDefault
- python - “我们很抱歉,找不到客户端”FreeIPA,Keycloak 设置
- sql - 将 Thu Sep 02 16:29:11 UTC 2021 转换为雪花中的时间戳
- firebase - 如何限制对 Firestore 数据库的访问仅限来自特定域的请求?
- javascript - 使用JS合并两个相同的字符串,它们出现在数组中的一行中
- excel - 根据 Excel VBA 中的输入月/年创建最近 12 个月的数组,包括月和年
- python - pip3 安装不工作无效语法?(视窗)
- ios - 在使用 fastlane 部署 firebase 分发时,在 React Native 应用程序中出现 PhaseScriptExecution 错误