#php #phpunit
#php #phpunit
Вопрос:
Когда я тестирую конструктор, который генерирует исключение, используя expectExceptionMessage(‘сообщение об исключении’), тест завершается неудачно, и фактический текст сообщения имеет префикс «Class ‘namespace Class_Name'».
В нем также указано, что вместо ожидаемого исключения типа было выдано исключение типа Error .
Я неправильно создаю свое исключение?
Я смог выполнить тестовый проход, исключив функцию expectExceptionMessage и заключив код в оператор try catch . Для меня это не имеет смысла.
Использование аннотаций
/**
* @expectedException Exception
* @expectedExceptionMessage no_file.json not found
*/
Также не решило проблему.
Тестовый код PHPUnit:
public function testNonExistingFileInConstructor() {
$this->expectException( 'Exception' );
$this->expectExceptionMessage( 'no_file.json not found');
new Json_File('no_file.json');
}
Код, вызывающий исключение:
public function __construct( $path_to_file ) {
$json_file = file_get_contents( $path_to_file );
if( false === $json_file ) {
throw new Exception( $json_file . ' not found', 500 );
}
$data = json_decode( $json_file, true );
if ( is_null( $data) ) {
throw new Exception( 'invalid json in ' . $json_file, 600 );
}
$this->data = $data;
}
Ответ №1:
Не используйте аннотации для ожидания исключений.
Всегда используйте полные имена классов с expectException()
, например $this->expectException(YourNamespaceException::class);
, вместо $this->expectException('Exception');
. ‘Exception’ — это просто строка, которая не может быть преобразована в правильное, полное имя исключения, которое вы ожидаете.
Комментарии:
1. Я видел это в вашей статье о том, почему не использовать аннотации, я просто попытался посмотреть, сработает ли это 🙂 Я только что протестировал его, и ofc (поскольку мы обязаны вам PHPUnit) работает! Спасибо! Насколько я понимаю, я вижу, что $this-> expectExceptionMessage(‘мое сообщение’) теперь также работает после исправления вызова $this-> expectException . Означает ли это, что функция expectExceptionMessage зависит от правильного класса, передаваемого expectException? Еще раз спасибо, не только за ответ, но и за скорость 🙂