Как обработать неудачное утверждение PHP с помощью PHPUnit?


У меня есть утверждение в моем коде. Что-то вроде:

assert('is_string($var)');

Если я напишу тест для PHPUnit, который приведет к сбою этого утверждения с сообщением, Warning: assert(): Assertion "is_string($var)" failed in /path/to/file.php on line ###

И мой тест тоже проваливается. Я попытался добавить @expectedException PHPUnit_Framework_Error_Warning в блок документов в соответствии с документацией , но это не помогает. Что мне нужно сделать, чтобы мой тест ожидал, что это утверждение потерпит неудачу?

Author: Joe Lencioni, 2011-09-20

2 answers

Из php.net/assert:

Утверждения следует использовать только в качестве функции отладки . Вы можете использовать их для проверки работоспособности, которая проверяет условия, которые всегда должны быть истинными и которые указывают на некоторые ошибки программирования, если их нет, или для проверки наличия определенных функций, таких как функции расширения или определенные системные ограничения и функции.

Утверждения не должны использоваться для обычных операций во время выполнения, таких как проверка входных параметров. Как эмпирическое правило: ваш код всегда должен работать правильно, если проверка утверждений не активирована.

Поэтому для обычной логики кода используйте логическое значение или некоторые заранее определенные константы. Для исключительной логики используйте обычные операторы if и используйте Exception для недопустимого ввода.

Если вы действительно заинтересованы в сохранении утверждений, вы могли бы определить обратный вызов assert, который вызывает Exception, который вы можете поймать в PHPUnit.

// PHP 5.3 Anonymous function as callback
// code is untested
assert_options(ASSERT_CALLBACK, function($file, $line, $code) {
    throw new Exception('Assert failed in $file on line $line');
});
 7
Author: bouke, 2011-09-20 16:27:52

Утверждения должны завершаться неудачей только в случае сбоя теста.

 0
Author: Lightness Races in Orbit, 2011-09-20 16:24:51