2013-03-20 39 views
0

首先,我認爲有人需要重寫我的問題,我知道我在問什麼,而不是我應該怎樣準確地提問。如何測試自己的Perl模塊,而不依賴於生產中的其他模塊?

假設我有一些本地模塊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(); 

回答

1

use lib具有進程範圍 - 也就是說,它以全局可見性更改值@main::INC,就像對@INC進行的非本地化分配一樣。這意味着您在說出use lib之後加載的任何模塊都將檢查您設置的包含路徑。

至於什麼路徑use lib套,它明確增加的@INC前,這樣以後調用模塊,用於搜索時use lib將過早考慮。

其結果是,它看起來像我的代碼示例只會工作。請注意,我會阻止您檢查您在測試中使用的是開發版本。這會導致您的測試失敗,其原因與測試中的函數是否實際正常工作無關。 (但是還要注意,你也應該寫出LOCAL::Cool的單元測試。)

+0

使用'使用lib Cwd :: abs_path();'工程 – Moni 2013-03-21 13:52:27

3

如果這樣運行的:

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

應該確保你的/home/me/perl版本首先檢查

+0

但是這可能會在@INC後默默地選擇一個同名的模塊。 – 2013-03-20 15:33:45

+0

@ C.Ramseyer,是的,但這個問題意味着'LOCAL :: Cool'包將在'/ home/me/perl'中可用,所以我沒有去那裏。反正好點。 – Lucas 2013-03-20 15:35:23

2

您加載所需的文件後,把這個:

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

當然,你可能死於任何你想要的模塊。

例如,我們有這個工具可以與Activestate的PerlEZ.dll一起使用。我們不想在安裝Perl的情況下部署它。但是我們需要使用一些我們藏在其他地方的圖書館。當我測試我的代碼時,我從隱藏的路徑中加入了一個模塊。它在隨時它看到一個標準庫路徑%INC。我們希望確保它幾乎涵蓋@INC掛鉤和特殊庫。

+0

好點,讓它確定無疑 – Moni 2013-03-21 07:47:47

2

我建議使用Perlbrew來做一個完全獨立的Perl安裝來測試。這樣你就可以控制測試環境,並且不必擔心它。

1

您可以添加一個BEGIN{ @INC = qw(directories you want to allow)}塊。當使用PERL5LIBuse lib等僅追加到包含路徑時,這將完全替代它,從而消除稍後在搜索路徑中拾取模塊的危險,例如,因爲你忘了安裝它/home/me/perl/

但真正的TDD答案可能是使用模擬模塊來處理所有不是被測模塊。

相關問題