2009-10-26 148 views
1

是否有更優雅的方式來編寫與O/S相關的測試腳本部分?針對Perl測試腳本的操作系統特定測試

請參考註釋行下面的代碼。

背景:模塊Perl :: Tags爲VIM創建一個標籤文件。在Win32上,目錄分隔符是「\」,但在其他操作系統上是「/」。 Vim的Perl支持模塊似乎很高興地閱讀標籤文件,所以似乎沒有必要修改模塊。

#!/usr/bin/perl -w 
use strict; use warnings; 
use Data::Dumper; 

use Test::More tests => 6; 
use FindBin qw($Bin); 

BEGIN { 
    use_ok('Perl::Tags'); 
} 

my $naive_tagger = Perl::Tags::Naive->new(max_level=>1); 
ok (defined $naive_tagger, 'created Perl::Tags'); 
isa_ok ($naive_tagger, 'Perl::Tags::Naive'); 
isa_ok ($naive_tagger, 'Perl::Tags'); 

my $result = 
    $naive_tagger->process(
     files => [ "$Bin/Test.pm" ], 
     refresh=> 1 
    ); 
ok ($result, 'processed successfully') or diag "RESULT $result"; 

# Other tests also fail because \Test.pm on Win32 vs /Test.pm on Linux/ OS X 
if ($^O =~ /MSWin32/) { 
    like ($naive_tagger, qr{Test\t\S+\\Test.pm\t/package Test;/}  , 'package line'); 
} else { 
    like ($naive_tagger, qr{Test\t\S+/Test.pm\t/package Test;/}  , 'package line'); 
} 

回答

3

File::SpecPath::Class是專門針對這些類型的平臺特定問題而構建的。

下面是你正在嘗試做什麼?

#!/usr/bin/perl 
use strict; use warnings; 

use Test::More tests => 6; 
use FindBin qw($Bin); 
use File::Spec::Functions qw(catfile catpath rootdir); 

BEGIN { 
    use_ok('Perl::Tags'); 
} 

my $naive_tagger = Perl::Tags::Naive->new(max_level => 1); 
ok (defined $naive_tagger, 'created Perl::Tags'); 
isa_ok ($naive_tagger, 'Perl::Tags::Naive'); 
isa_ok ($naive_tagger, 'Perl::Tags'); 

my $result = 
    $naive_tagger->process(
     files => [ catfile($Bin, 'Test.pm') ], 
     refresh => 1 
    ); 
ok ($result, 'processed successfully') or diag "RESULT $result"; 

my $file = catfile(rootdir, 'Test.pm'); 
# or $file = catpath('C:', rootdir(), 'Test.pm') 
# depending on what you mean. 

like($naive_tagger 
    qr{Test\t\S+\Q$file\E\t/package Test;/}, 
    'package line', 
); 
+0

感謝您指出Path :: Class。文件的字符串化('','Test.pm')根據需要返回\ Test.pm或/Test.pm。不幸的是,qr {}需要\\ Test.pm。我將在下面發佈臨時解決方案以供評論。 – heferav 2009-10-26 12:55:23

+0

這正是我想要做的,除了所有的測試都是在Test.pm上進行的,因此不需要聲明** my $ file **。 – heferav 2009-10-26 15:23:23

3

也許你可以簡單地總是使用Linux風格的斜線,因爲:

有,你必須意識到寫作必須NT和UNIX下運行Perl腳本時的許多重要問題。首先,存在路徑名的問題。在DOS,Windows NT和Windows 95中,可以使用反斜槓運算符指定路徑名,而在UNIX中使用正斜槓運算符。 Win32 Perl端口允許正斜槓或反斜槓。在路徑名中使用正斜槓的Perl腳本比使用反斜槓的腳本更可能是可移植的。除此之外,Perl腳本將不得不在字符串中使用反斜槓兩次以從Perl解釋器中反轉一個反斜槓實例。驅動器號不必更改。

例如,下面的路徑,可以使用任何的設置如下:

$myFile = "E:/users/default/datafile.txt"; 

$myFile = "E:\\users\\default\\datafile.txt"; 

(從Perl 5 Unleashed


如果你確信你不能始終使用Linux風格,您可以嘗試使用CPAN模塊File::SpecPath::Class。檢查"CPAN Module for mixing Unix/Windows path" discussion on Perlmonks獲取更多信息。

+0

謝謝。請參閱下面對思南的評論。 – heferav 2009-10-26 13:00:36

+0

@Sinan - 謝謝。 – 2009-10-26 15:14:56

+0

@Igor:不客氣。刪除了我的評論,因爲他們不再相關。 – 2009-10-26 16:05:58

0

修訂以下從思南Ünür指導 - 有沒有必要做OS特定的測試,如果

like ($naive_tagger, qr{Test\t\S\Test.pm\t/package Test;/}  , 'package line'); 

被替換

like ($naive_tagger, qr{Test\t\S+\QTest.pm\E\t/package Test;/}  , 'package line'); 

\ Q(禁用)模式元字符直到\ E

\ E再次禁用模式元字符

+0

**'qr {Test \ t \ S + \ Q $ file \ E \ t/package Test; /}'**不需要所有的箍環。 – 2009-10-26 14:24:49

+0

輝煌。作品一種享受。非常感謝你。以前的嘗試值得投票! – heferav 2009-10-26 15:09:41

+0

請注意,沒有必要用粗體提及我的名字。另外,我認爲你在當前版本中做了某種cut'n'paste錯誤。看看它,看看你是否在說你的意思。 – 2009-10-26 15:13:28

相關問題