0

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

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

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

#!/usr/bin/perl 
# test_local_commons.pl
# directory: /home/me/perl

use strict;
use warnings;
use Test::More 'no_plan';
use File::Temp qw( tempfile tempdir );

use Cwd qw();
use lib  Cwd::abs_path();
# Testing 
use LOCAL::Commons qw ( globalTrim );

sub newTest($) {
    my $name = shift;
    print "---------------------------------------------------\n";
    print $name, "\n";
    print "---------------------------------------------------\n";
}

sub testTraverse {
   is(globalTrim("  - stackoverflow  - ), "-stackoverflow-", "Passed" );
}

newTest "testTraverse"; testTraverse ();
4

5 回答 5

3

如果你这样运行:

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

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

于 2013-03-20T15:27:09.443 回答
2

加载所需文件后,输入:

die 'Included PRODUCTION Module!!!' 
    if grep { m{/usr/local/lib/perl/LOCAL/Cool} } values %INC
    ;

当然,你可以为任何你想要的模块而死。

例如,我们有这个工具可以与 Activestate 的PerlEZ.dll. 我们不想在安装 Perl 的情况下部署它。但是我们需要使用一些我们隐藏在其他地方的库。当我测试我的代码时,我会从我们的隐藏路径中包含一个模块。每当%INC. 我们要确保它几乎来自@INC钩子和特殊库的所有内容。

于 2013-03-20T15:28:05.883 回答
2

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

于 2013-03-20T15:31:15.177 回答
1

你可以只添加一个BEGIN{ @INC = qw(directories you want to allow)}块。虽然 usingPERL5LIBuse lib只是附加到包含路径,这将完全替换它,从而消除模块稍后在搜索路径中被拾取的危险,例如,因为您忘记安装它/home/me/perl/

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

于 2013-03-20T15:33:00.613 回答
1

use lib具有流程范围——也就是说,它@main::INC以全局可见性更改值,就像对 will 的非本地化分配@INC一样。这意味着您在说之后加载的任何模块use lib都会检查您设置的包含路径。

至于设置什么路径use lib,它显式添加到前面,@INC以便use lib在搜索模块时更早地考虑后面的调用。

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

于 2013-03-20T15:53:58.233 回答