Как выполнить модульное тестирование Исключения с помощью PHPUnit?

Я не получаю, как выполнять модульные тесты Исключения с помощью PHPUnit.

См. Мой метод с Исключением:

public function getPhone($html, $tag = 'OFF', $indicative, $number_lenght) { // .. code if ($tag <> 'OFF') { $html = $doc[$tag]->text(); // Apanho apenas o texto dentro da TAG if (empty($html)) { throw new Exception("Nao foi possivel apanhar qualquer texto dentro da TAG, Metodo em causa: getPhone()"); } } // .. code } 

И теперь мой тест PHPUnit:

 <?php require_once '../Scrap.php'; class ScrapTest extends PHPUnit_Framework_TestCase { protected $scrap; // Setup function to instantiate de object to $this->scrap protected function setUp() { $this->scrap = new Scrap; } /** * @covers Scrap::getPhone * @expectedException Exception * */ public function testGetPhone() { // Variables1 $array_static1 = Array(0 => 218559372, 1 => 927555929, 2 => 213456789, 3 => 912345678); $phone_list1 = '</div>A Front para<br /><br /><br /><br /><br /><br />-Apoio;<br />-Criação;<br />-Campanhas;<br />-Promoções<br /><br /><br />CONDIÇÕES:<br /><br />Local de Trabalho: Es<br />Folgas: Mistas<br /><br /><br /><br />ordem 500€<br /><br /><br /><br />Mínimos:<br /><br />- Conhecimentos;<br />- Ensino ;<br />-INGLÊS.<br /><br /><br /><br />Candidaturas: <br />email@ffff.es<br />218559372 | 927 555 929 | <br />RH<br />Rua C. Sal. 40<br />1000-000 Lisboa<br /><br /><br />+351 21 3456789 | (351) 912345678'; // Variables2 $array_static2 = Array(0 => 'NA'); $phone_list2 = ""; // .. more tests // Test Exception, Tag not found if (TRUE) { // Bloco try/catch para confirmar que aqui lança excepção try { $this->scrap->getPhone($phone_list1, 'hr', '351', '9'); } catch (Exception $expected) { return; } $this->fail('An expected exception has not been raised.'); } } } ?> 

Если я запустил тест, я получил «Failure»:

 1) ScrapTest::testGetPhone Expected exception Exception FAILURES! Tests: 1, Assertions: 5, Failures: 1. 

Исключение возникает, но я не хочу получить сбой в PHPUnit. Если повышение Exception, я хочу получить тест ОК.

Можете ли вы дать мне несколько подсказок?

С наилучшими пожеланиями,

Вы слишком много делаете.

Использование эфира : исключение @expectedException

ИЛИ : try / catch / $ this-> fail

То, как вы делаете это прямо сейчас, говорит «поймайте это исключение, и THEN ожидают, что код выбросит еще один!»

На мой взгляд, первый способ чище, потому что это всего лишь 1 строка против 5 (или даже больше) строк кода, и она менее подвержена ошибкам.

 /** * @covers Scrap::getPhone * @expectedException Exception * */ public function testGetPhone() { // Variables1 $array_static1 = Array(0 => 218559372, 1 => 927555929, 2 => 213456789, 3 => 912345678); $phone_list1 = '...'; // Variables2 $array_static2 = Array(0 => 'NA'); $phone_list2 = ""; // .. more tests // Bloco try/catch para confirmar que aqui lança excepção $this->scrap->getPhone($phone_list1, 'hr', '351', '9'); 

Это должно сделать это.

Есть два способа проверить заброшенные исключения, но это зависит от ваших потребностей. Если вы не заботитесь о содержании / свойствах исключения (например, код, сообщение и т. Д.), Вы можете сделать следующее:

 $this->setExpectedException('MyApp\Exception'); $object->someFailingCodeWithException(); 

Иначе, если вам нужно использовать свойства исключения для утверждения (например, код), то вы можете выполнить try-catch-fail:

 try { $object->someFailingCodeWithException(); } catch (MyApp\Exception $e) { $this->assertEquals($e->getCode(), 100); return; } $this->fail(); 

Обратите внимание на оператор return внутри блока catch . $this->fail(); оператор будет / должен вызываться только после того, как не будет возбуждено исключение. Таким образом, этот тестовый пример терпит неудачу, поскольку он должен проверить исключение, которое не выбрасывается в первую очередь.