Специфические тесты ОС для сценариев тестирования Perl - PullRequest
1 голос
/ 26 октября 2009

Есть ли более элегантный способ написания части тестового сценария, которая зависит от операционной системы?

Пожалуйста, обратитесь к коду под строкой комментария.

Фон: Модуль Perl :: Теги создает файл тегов для VIM. В Win32 разделитель каталогов - «\», а в других ОС - «/». Модуль поддержки Perl в Vim, похоже, довольно успешно читает файл тегов, поэтому нет необходимости изменять модуль.

#!/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 ]

3 голосов
/ 26 октября 2009

File :: Spec и Path :: 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',
);
3 голосов
/ 26 октября 2009

Может быть, вы всегда можете использовать косые черты в стиле Linux, потому что:

Есть много важных проблем, о которых вы должны знать при написании сценариев Perl, которые должны работать в NT и UNIX. Прежде всего, существует проблема имен путей. В DOS, Windows NT и Windows 95 вы задаете имена путей с помощью оператора обратной косой черты, тогда как в UNIX вы используете оператор прямой косой черты. Perl-порт Win32 допускает прямую или обратную косую черту. Сценарий Perl, использующий косую черту в путевых именах, более переносим, ​​чем сценарий, использующий обратную косую черту. Кроме того, сценарии Perl должны дважды использовать обратную косую черту в строках, чтобы экранировать один экземпляр обратной косой черты из интерпретатора Perl. Буквы дисков не должны меняться.

Например, следующее имя пути может быть установлено с помощью одного из следующих:

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

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

(из Perl 5 Unleashed )


Если вы уверены, что не всегда можете использовать стиль Linux, вы можете попробовать использовать модули CPAN File :: Spec или Path :: Class . Обратитесь к обсуждению «Модуль CPAN для смешивания путей Unix / Windows» на Perlmonks для получения дополнительной информации.

0 голосов
/ 26 октября 2009

Пересмотрено в соответствии с указаниями Sinan Ünür - нет необходимости проводить специальные тесты ОС, если

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 снова отключить метасимволы шаблона

...