Я собираю несколько подпрограмм, которые являются общими для нескольких моих сценариев, в модуль. (Я должен был сделать это раньше, но начал с унаследованных сценариев.) Я моделирую свою работу на очень полезном примере здесь , используя Test :: More и Module :: Build
Все подпрограммы, которые читают или пишут из файлов, все содержат строку open () или die "errmsg"
. Я в процессе написания теста для модуля и столкнулся с этой проблемой. Одна из подпрограмм проверяет, указывает ли путь на что-либо или нет, умирает при неудаче. В унаследованных сценариях подпрограмма выглядит следующим образом:
sub checkExist {
my ($type, $path) = @_;
if ($type eq 'd') {
if (! -d $path) {
warn("dir not found: $path\n");
die $pathNotFound;
}
}
elsif ($type eq 'f') {
if (! -f $path) {
warn("file not found: $path\n");
die $pathNotFound;
}
elsif (! -s $path) {
warn("empty file: $path\n");
die $emptyFile;
}
}
}
, сейчас я проверяю это следующей строкой:
is(HomeBrew::IO::checkExist('f', $0), '', "can checkExist find file $0 ?");
, которая работает нормально, если я не выберу путь, которого не существует, и в этом случае Тестовый сценарий умирает, но тест завершается успешно , производя следующий вывод:
# Looks like your test exited with 2 just after 5.
Dubious, test returned 2 (wstat 512, 0x200)
All 5 subtests passed
Я бы предпочел, чтобы это был неудачный тест (а не сомнительный проход), но так как это устаревший код, я также хочу эта подпрограмма для остановки выполнения при сбое. Что делать? Глупо ли писать тест для такой простой функции?
Я уже написал функцию checkExist2, которую я буду использовать в будущем, которая в случае успеха возвращает undef, иначе будет ненулевая ошибка (поэтому я могу написать die, если checkExist2 ()
в другом месте). Другие предложения, которые не поддерживают функциональность checkExist, приветствуются.
Правильный способ проверить, работает ли код или умирает с правильной ошибкой, — это Test::Exception. Вы можете обернуть этот тест вокруг других тестовых случаев, так как он просто принимает coderef:
use Test::More;
use Test::Exception;
lives_ok {
is(HomeBrew::IO::checkExist('f', $0), '',
"can checkExist find file $0 ?")
} '...and code does not die';
Почему бы не иметь в тестовом модуле вспомогательную подпрограмму, которая оборачивает eval{}
вокруг вызова HomeBrew::IO::checkExist
и проверяет сбой через $@
?
sub runcheckExist {
my $res = eval { HomeBrew::IO::checkExist('f', $0) };
# May want more logic here
# for checking $@ for specific error text pattern
# or $res
return $@ ? 1 : 0;
}
my $expect_to_die = 1;
is(runcheckExist(), $expect_to_die, "can checkExist find file $0 ?");