如何通过命令行perl调用测试缺少的可选perl模块

时间:2018-10-22 13:15:15

标签: perl

我有一个测试套件,其中有数百个针对尚未发布的perl模块的测试,这是一个命令行界面。由于它是一个命令行界面,因此所有测试(直到现在)都被编写为将代码拖放到模板中,然后使用系统调用来调用模板脚本。

我最近在第3方模块上添加了一个可选的依赖项,它不是核心perl的一部分。我知道我的模块无论是否安装该模块都可以工作,因为我有一台安装了该模块的计算机,没有一台计算机,并且该模块在每种情况下都没有错误。但是,我希望能够编写一个测试来确认我的模块在第3方模块不存在时可以正常工作-即使第3方模块 已安装,但行为却并非如此。

理想情况下,我可以使用已经设置好的结构进行测试,从而对模板脚本进行系统调用。我知道我可以编写一个单独的测试脚本,该脚本在BEGIN块中处理@INC,导入使用该模块的特定方法,然后像单元测试一样调用它们。但是我想知道是否有一种方法可以使用已经进行所有其他测试的测试结构,即进行系统调用。

那么有没有一种方法可以防止通过perl命令行选项导入模块?我已经尝试过-M-Module,但是代码use Module仍会导入该模块。

顺便说一句,我的模块在评估板上使用了第三方模块,这就是我将其设为可选的方式。

1 个答案:

答案 0 :(得分:4)

我为此情况写了Test::Without::Module。它通过修改@INC来工作,以防止加载您命名的模块。对于测试,您可以从命令行运行测试:

perl -MTest::Without::Module=Some::Module -w -Iblib/lib t/SomeModule.t

或者允许/禁止从测试套件中加载模块:

use Test::Without::Module qw( My::Module );

# Now, loading of My::Module fails :
eval { require My::Module; };
warn $@ if $@;

# Now it works again
eval q{ no Test::Without::Module qw( My::Module ) };
eval { require My::Module; };
print "Found My::Module" unless $@;