【问题标题】:How to test missing optional perl modules via the command line perl call如何通过命令行 perl 调用测试缺少的可选 perl 模块
【发布时间】:2019-03-26 14:05:57
【问题描述】:

我有一个测试套件,其中包含数百个针对我尚未发布的 perl 模块的测试,它是一个命令行界面。因为它是一个命令行界面,所以测试(直到现在)都是为了将​​代码放入模板中,然后使用系统调用调用模板脚本。

我最近添加了一个对第三方模块的可选依赖,它不是核心 perl 的一部分。我知道无论是否安装了该模块,我的模块都可以工作,因为我有一台安装了它的计算机,而另一台没有安装该模块,并且该模块在每种情况下都可以正常工作。但是,我希望能够编写一个测试来确认当第 3 方模块不存在时我的模块是否可以工作 - 即使第 3 方模块 ,我也希望该测试可以工作> 已安装,但表现得好像没有安装一样。

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

那么有没有办法通过 perl 命令行选项排除模块导入?我试过 -M-Module,但代码use Module 仍然会导入模块。

顺便说一句,我的模块在 eval 中使用了第 3 方模块,这就是我将其设为可选的方式。

【问题讨论】:

    标签: perl


    【解决方案1】:

    我为这个确切的情况写了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 $@;
    

    【讨论】:

    • 啊,你是 perlmonks 帖子的人。伟大的。我承认我太不耐烦了,无法阅读整本书。但我很高兴我发布了,因为你的回复真的把它归结了。我一定会试试看的。
    • 所以我才意识到我必须先解决另一个问题才能判断此测试是否有效。对于模块 Term::ReadKey,除非我检测到我与 tty 有连接,否则我不会评估模块的使用。所以我必须弄清楚如何让脚本认为它对 tty 是开放的。而且我需要确保该 tty 的宽度不是我的默认值 80...?
    • ... 或通过设置一些环境变量或命令行开关来触发它。#
    • 嗯。即使我可以触发 eval,我也无法确认测试是否成功,除非我可以测试相反的情况。我需要对第 3 方模块加载并设置术语宽度!= 80 进行正面测试,在模块未加载且我得到默认宽度 80 的情况下进行负面测试。我想这不是你的问题。一旦弄清楚并且一切正常,我将选择此答案。
    • 我会为这些测试用例设置不同的测试文件,并分别确保模块可以加载或不加载。您通常可以通过设置 $ENV{COLS} 来伪造终端宽度。
    猜你喜欢
    • 2017-07-23
    • 2015-12-06
    • 2012-01-07
    • 1970-01-01
    • 2023-03-04
    • 2011-06-14
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多