2009-10-26 141 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