Можно ли проверить наличие ожидаемых ошибок, когда тестируемый завершает работу с ошибкой, используя TAP в Perl? - PullRequest
4 голосов
/ 23 декабря 2010

Предположим, что вы выполняете какие-то модульные тесты и хотите увидеть, что метод (или сценарий, или функция, или что-то еще), который вы тестируете, не проходит как надо. Как вы настраиваете такой тест? Я надеюсь на что-то вроде этого:

ok( $obj->method($my, $bad, $params) == DEATH, 'method dies as expected');

хотя я не вижу, как это будет работать, поскольку method die s, когда переданы неверные параметры и тестовый скрипт останавливается.

Есть ли другой способ?

Ответы [ 3 ]

5 голосов
/ 23 декабря 2010

Я рекомендую Test :: Fatal вместо Test :: Exception .

Test :: Exception существует уже долгое время, поэтому многиесуществующие тестовые наборы используют его, но Test :: Fatal легче освоить.Test :: Fatal экспортирует только 1 функцию: exception.Это запускает связанный код и возвращает исключение, которое он выдал, или undef, если он работал без ошибок.Затем вы проверяете это возвращаемое значение, используя любую из обычных Test :: More функций, таких как is, isnt, like или isa_ok.

Test :: Exceptionтребует, чтобы вы изучили его собственные функции тестирования, такие как throws_ok и dies_ok, и помните, что вы не должны ставить запятую между кодом и именем теста.

Итак, ваш пример будет:

use Test::More;
use Test::Fatal;

my $obj = ...;

isnt(exception { $obj->method($my, $bad, $params) },
     undef, 'method dies as expected');

Или вы можете использовать like, чтобы соответствовать ожидаемому сообщению об ошибке, или isa_ok, чтобы проверить, выдал ли он правильный класс объекта исключения.

Test :: Fatal просто дает вамбольше гибкости с меньшей кривой обучения, чем Test :: Exception.

5 голосов
/ 23 декабря 2010

Вы пробовали Тест :: Исключение ? dies_ok должен делать то, что вы хотите. Например:

# Check that something died - we do not care why
dies_ok { $foo->method } 'expecting to die';
1 голос
/ 24 декабря 2010

Нет необходимости использовать модуль для этого. Вы можете просто обернуть вызов, который вы ожидаете, потерпеть неудачу в блоке eval следующим образом:

ok !eval {$obj->method($my, $bad, $params); 1}, 'method dies as expected';

Если в eval все идет хорошо, он вернет последний выполненный оператор, который в данном случае равен 1. в случае неудачи eval вернет undef. Это противоположно тому, что хочет ok, поэтому ! перевернет значения.

Затем вы можете следовать за этой строкой с проверкой фактического сообщения об исключении, если хотите:

like $@, qr/invalid argument/, 'method died with invalid argument';
...