PHPUnit: как получить исключение ORIGINAL, вызывающее PHPUnit_Framework_Error_Warning

1

Я пишу PHPUnit test (v4.6.7) для нового класса PHP (v5.3.3), который делает материал с XML. Цель теста - подтвердить, что класс бросает DOMException при передаче плохих XML.

Я хочу собрать исключение и выполнить assertInstanceOf, сравнивая его с DOMException.

Независимо от того, что я делаю, к тому моменту, когда я вижу исключение, phpunit уже преобразовал исходное исключение в экземпляр PHPUnit_Framework_Error_Warning.

Например, вот одно усилие в тестируемом коде:

//...
try {
    $this->code_that_causes_exception();
} catch (\Exception $exception) {
    $className = get_class($exception);
    throw $exception;
}
//...

При запуске из phpunit строка, хранящаяся в $ className, является PHPUnit_Framework_Error_Warning, в отличие от любого исключения, code_that_causes_exception действительно вызывает code_that_causes_exception.

Начать обновление

Чтобы уточнить мой вопрос, без попытки/уловить тестируемый код, сообщением, сообщенным phpunit, является DOMDocument::loadXML(): Start tag expected, '<' not found in Entity, line: 1. Я делаю, возможно, опрометчивое предположение, что DOMDocument бросает какое-то исключение для создания этого сообщения. DOMDocument говорит, что DOMException является родительским элементом исключений, отбрасываемых из объектов DOMDocument.

Окончательное обновление

Я хочу исходное исключение, чтобы я мог обернуть тестируемый код подходящим try/catch, чтобы изящно справиться с этой ситуацией с ошибкой. Как получить исходное исключение, из которого был PHPUnit_Framework_Error_Warning экземпляр PHPUnit_Framework_Error_Warning?

Теги:
exception
exception-handling
phpunit

1 ответ

3

Почему это происходит

Ваше исключение не преобразуется в PHPUnit_Framework_Error_Warning, оно никогда не выбрасывается. PHPUnit автоматически преобразует предупреждения PHP в исключения. Это включено свойством convertWarningsToExceptions в файле конфигурации XML (также есть convertNoticesToExceptions и convertErrorsToExceptions соответственно). По умолчанию все эти настройки true.

Это означает, что ваше исходное исключение, вероятно, никогда не выбрасывается, потому что предупреждение PHP запускается до и затем преобразуется в (мгновенно заброшенное) исключение с помощью обработчика ошибок PHPUnit.

Познакомьтесь с вашим пойманным исключением, чтобы увидеть, какой оператор в коде запускает предупреждение PHP (просто удалите оператор try/catch чтобы PHPUnit представил ошибку).

Вы можете отключить это поведение в файле phpunit.xml:

<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.6/phpunit.xsd"
     ...
     convertErrorsToExceptions="false"
     convertNoticesToExceptions="false"
     convertWarningsToExceptions="false"
     ...

Как вы должны проверять исключения

Вероятно, самым простым способом утверждать, что @expectedException конкретное исключение, является использование аннотации @expectedException. Это подробно описано в руководстве. Использование этой аннотации позволяет сэкономить вам код шаблона:

/**
 * @expectedException DOMException
 * @test
 */
public function myTestCase() {
    $this->code_that_causes_exception();
}

Этот тест пройдет, когда DOMException будет сброшен и завершится неудачей, если вообще не будет выбрано исключение (или любое другое исключение выбрано).

  • 0
    Это полезно Моя цель при запуске этого теста состояла в том, чтобы выяснить, какие исключения, предупреждения или уведомления действительно происходили в реальном коде. «Сообщение», как сообщает phpunit в PHPUnit_Framework_Error_Warning, было DOMDocument::loadXML(): Start tag expected, '<' not found in Entity, line: 1 . Моя задача кодирования состояла в том, чтобы расширить тестируемый код, чтобы распознать и правильно обработать этот случай. Поэтому я хочу простой способ увидеть, что провоцирует поведение php.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню