Test :: More не знает, умирает ли тест - так как мне тестировать?

Я собираю несколько подпрограмм, которые являются общими для нескольких моих сценариев, в модуль. (Я должен был сделать это раньше, но начал с унаследованных сценариев.) Я моделирую свою работу на очень полезном примере здесь , используя 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, приветствуются.

7
задан Community 23 May 2017 в 10:27
поделиться

2 ответа

Правильный способ проверить, работает ли код или умирает с правильной ошибкой, — это 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';
16
ответ дан 6 December 2019 в 10:46
поделиться

Почему бы не иметь в тестовом модуле вспомогательную подпрограмму, которая оборачивает 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 ?");
2
ответ дан 6 December 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: