Test :: More не знает, умирает ли тест - так как мне проверить? - PullRequest
7 голосов
/ 27 августа 2010

Я собираю набор подпрограмм, которые являются общими для набора моих скриптов, в модуль.(Я должен был сделать это раньше, но начал с унаследованных сценариев.) Я моделирую свою работу на очень полезном примере здесь , используя Test :: More и Module:: Build

Все подпрограммы, которые читают или пишут из файлов, содержат строку open() or 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 if checkExist2() в другом месте).Приветствуются другие предложения, которые не поддерживают функциональность checkExist.

Ответы [ 2 ]

16 голосов
/ 27 августа 2010

Правильный способ проверить, живет ли код или умирает с правильной ошибкой, с помощью 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';
2 голосов
/ 27 августа 2010

Почему бы не иметь вспомогательную подпрограмму в вашем тестовом модуле, которая обернет 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 ?");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...