Я пишу 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
?
Ваше исключение не преобразуется в 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
будет сброшен и завершится неудачей, если вообще не будет выбрано исключение (или любое другое исключение выбрано).
DOMDocument::loadXML(): Start tag expected, '<' not found in Entity, line: 1
. Моя задача кодирования состояла в том, чтобы расширить тестируемый код, чтобы распознать и правильно обработать этот случай. Поэтому я хочу простой способ увидеть, что провоцирует поведение php.