Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不依赖生产中的其他模块的情况下测试自己的Perl模块?_Perl_Unit Testing_Perl Module_Cpan - Fatal编程技术网

如何在不依赖生产中的其他模块的情况下测试自己的Perl模块?

如何在不依赖生产中的其他模块的情况下测试自己的Perl模块?,perl,unit-testing,perl-module,cpan,Perl,Unit Testing,Perl Module,Cpan,首先,我认为有人需要重写我的问题,我知道我在问什么,而不是我应该如何准确地问 假设我有一些本地模块local::Commons,它有一个名为globalTrim的子例程。我正在测试下面的子例程,虽然LOCAL::Commons安装在/usr/LOCAL/lib/perl下,但下面测试的模块位于/home/me/perl/LOCAL/目录中。看看我是如何使用库。。。为了确保我没有使用位于/usr/LOCAL/lib/perl中的LOCAL::Commons,我的路径上有这个目录 现在,如果LOCA

首先,我认为有人需要重写我的问题,我知道我在问什么,而不是我应该如何准确地问

假设我有一些本地模块local::Commons,它有一个名为globalTrim的子例程。我正在测试下面的子例程,虽然LOCAL::Commons安装在/usr/LOCAL/lib/perl下,但下面测试的模块位于/home/me/perl/LOCAL/目录中。看看我是如何使用库。。。为了确保我没有使用位于/usr/LOCAL/lib/perl中的LOCAL::Commons,我的路径上有这个目录

现在,如果LOCAL::Commons正在使用另一个本地模块LOCAL::Cool(不是来自cpan),并且我也对该模块进行了一些更改,那么如何确保我的测试使用了正确的模块?也就是说,我希望LOCAL::Commons使用/home/me/perl/LOCAL/Cool而不是/usr/LOCAL/lib/perl/LOCAL/Cool


如果这样运行:

perl -I/home/me/perl test_local_commons.pl

它应该确保首先检查您的/home/me/perl版本

加载所需文件后,放入以下内容:

die 'Included PRODUCTION Module!!!' 
    if grep { m{/usr/local/lib/perl/LOCAL/Cool} } values %INC
    ;
当然,你可以为任何你想要的模块而死

例如,我们有一个与Activestate的PerlEZ.dll一起工作的工具。我们不希望在安装Perl的情况下部署它。但是我们需要使用一些我们隐藏在别处的库。当我测试代码时,我会从隐藏路径中包含一个模块。只要它在%INC中看到标准库路径,它就会爆炸。我们希望确保它几乎涵盖了@INC钩子和特殊库的所有内容。

我建议使用来进行完全独立的Perl安装以进行测试。这样,您就可以控制测试环境,而不必担心它。

您只需添加一个BEGIN{@INC=qwdirectories您想要允许的}块。在使用PERL5LIB、use lib等时,只需将其附加到include路径,这将完全替换它,从而消除稍后在搜索路径中拾取模块的危险,例如,因为您忘记安装它/home/me/perl/

但真正的TDD答案可能是对所有不是测试中的模块使用模拟模块。

use lib具有流程范围-也就是说,它使用全局可见性更改@main::INC的值,就像对@INC的非本地化赋值一样。这意味着,在说出use lib之后加载的任何模块都将检查您设置的include路径

至于使用lib集的路径,它显式地添加到@INC的前面,以便在搜索模块时更早地考虑稍后对使用lib的调用


其结果是,在我看来,您的代码示例可以正常工作。请注意,我不鼓励您在测试中检查是否使用了开发中的版本。这将导致您的测试失败,原因与测试中的函数是否正确工作无关。但还要注意,您还应该为LOCAL::Cool编写单元测试。

但这可能会在稍后的@INC.@C.Ramseyer中悄悄地获取相同名称的模块,没错,但问题意味着LOCAL::Cool包将在/home/me/perl中提供,所以我没有去那里。无论如何,这是一个很好的观点。
die 'Included PRODUCTION Module!!!' 
    if grep { m{/usr/local/lib/perl/LOCAL/Cool} } values %INC
    ;