0

First of all, I think somebody needs to rewrite my question, I know what I am asking, not how I should ask it precisely.

Assume I have some local module LOCAL::Commons and it has one subroutine called globalTrim. I am testing that subroutine below, and while LOCAL::Commons is installed under /usr/local/lib/perl, the module I am testing below is located in directory /home/me/perl/LOCAL/. See how I am using use lib ... to make sure I am not using LOCAL::Commons located in /usr/local/lib/perl (I have this directory on my path).

Now, if LOCAL::Commons is using another local module LOCAL::Cool (that is, not from cpan), and I have also made some changes to that module, how can I make sure my tests are using the correct modules? That is, I want LOCAL::Commons to use /home/me/perl/LOCAL/Cool and not /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

use libにはプロセス スコープがあります。つまり、@main::INCローカライズされていない割り当てと同じように、グローバルな可視性で値を変更します@INC。つまり、言った後にロードするモジュールは、use lib設定したインクルード パスをチェックします。

どのパスが設定されているかについては、モジュールを検索するときに後で呼び出されたものが以前に考慮されるようuse libに、の前に明示的に追加されます。@INCuse lib

その結果、あなたのコードサンプルがうまくいくように見えます。テストで開発中のバージョンを使用していることを確認することを思いとどまらせることに注意してください。これにより、テスト対象の関数が実際に正しく機能するかどうかとは無関係の何かに基づいて、テストが失敗する可能性があります。(ただし、 の単体テストも作成する必要があることに注意してくださいLOCAL::Cool。)

于 2013-03-20T15:53:58.233 に答える
1

BEGIN{ @INC = qw(directories you want to allow)}ブロックを追加するだけです。などを使用するPERL5LIBuse libインクルード パスに追加されるだけですが、これにより完全に置き換えられるため、インストールを忘れたなどの理由でモジュールが検索パスの後半で検出される危険がなくなります/home/me/perl/

しかし、TDD の本当の答えは、おそらく、テスト対象のモジュール以外のすべてにモック モジュールを使用することです。

于 2013-03-20T15:33:00.613 に答える