Подтвердить что ты не робот

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

Я не получаю как unit test Исключения с 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 protected]<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, я хочу получить тест OK.

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

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

4b9b3361

Ответ 1

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

Эфир: исключение @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');        

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

Ответ 2

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

$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(); будет/должен вызываться только после того, как исключение не вызвано. Таким образом, этот тестовый пример терпит неудачу, поскольку он должен проверить исключение, которое не выбрасывается в первую очередь.