При тестировании исключений с помощью PHPUnit, каков наилучший способ потребовать, чтобы каждый оператор или утверждение должны вызывать исключение для прохождения теста?Как проверить несколько исключений с помощью PHPUnit?
Я в принципе хочу сделать что-то вроде этого:
public function testExceptions()
{
$this->setExpectedException('Exception');
foo(-1); //throws exception
foo(1); //does not throw exception
}
//Test will fail because foo(1) did not throw an exception
Я придумал следующий, который делает работу, но довольно уродливые ИМО.
public function testExceptions()
{
try {
foo(-1);
} catch (Exception $e) {
$hit = true;
}
if (!isset($hit))
$this->fail('No exception thrown');
unset($hit);
try {
foo(1);
} catch (Exception $e) {
$hit = true;
}
if (!isset($hit))
$this->fail('No exception thrown');
unset($hit);
}
Я определенно вижу вашу точку зрения, хотя по-прежнему кажется странным иметь несколько тестов, когда каждая точка должна гарантировать, что будет выбрано исключение. – etheros
Вы также можете использовать аннотацию @dataProvider для передачи значений (и даже имя ожидаемого исключения - используйте это с помощью $ this-> setExpectedException ($ x) '). Добавление нового тестового значения (которое создало бы исключение) было бы просто другой записью массива в функции dataProvider. –
Роберт Мартин сказал, что всегда разбивает дела на разные тесты. На мой взгляд, ответ @AlisterBulman показывает идеальное решение проблемы. –