如何在不依赖生产中的其他模块的情况下测试自己的Perl模块?
首先,我认为有人需要重写我的问题,我知道我在问什么,而不是我应该如何准确地问 假设我有一些本地模块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模块?,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
如果这样运行:
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
;