Тесты для конкретной операционной системы для тестовых сценариев Perl

StackOverflow https://stackoverflow.com/questions/1624253

Вопрос

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

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

Предыстория: Модуль 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');
}
Это было полезно?

Решение

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',
);

Другие советы

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

Есть много важных проблем, о которых вы должны знать при написании Perl-скриптов, которые должны выполняться под NT и UNIX.Прежде всего, возникает проблема с именами путей.В 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)


В случае, если вы уверены, что не всегда сможете использовать стиль Linux, вы можете попробовать использовать модули CPAN Файл::Spec или Путь::Класс.Проверьте Обсуждение "Модуля CPAN для смешивания путей Unix / Windows" на Perlmonks для получения дополнительной информации.

Пересмотрено в соответствии с указаниями Sinan & n2; n & # 252; 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 снова отключите метасимволы шаблонов

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top