Почему PHPUnit «получает» объект ошибки вместо объекта исключения

#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? Еще раз спасибо, не только за ответ, но и за скорость 🙂