2010-11-11 3 views
6

У меня есть набор тестов, и я хочу проверить, что мои классы генерируют исключения в нужное время. В примере, мой класс использует метод магического __get(), так что мне нужно, чтобы проверить, что исключение, когда недопустимое свойство извлекается:PHPUnit не ловит ожидаемых исключений

function testExceptionThrownWhenGettingInvalidProperty() { 
    $obj = new MyClass(); 
    $this->setExpectedException("Property qwerty does not exist"); 
    $qwerty = $obj->qwerty; 
} 

Класс выдает ошибку, как и должно быть, но вместо того, просто получая пропуск, исключение не поймано!

There was 1 error: 

1) QueryTest::testExceptionThrownWhenGettingInvalidProperty 
Exception: Property qwerty does not exist 

я перед использованием SimpleTest и $this->expectException(new Exception("Property qwerty does not exist")); работал просто отлично. Я знаю, что есть другие методы (@expectedException и try-catch), но этот должен работать, и он выглядит намного чище. Любые идеи, как я могу сделать эту работу?

ответ

13

Он не ищет текст, за исключением, он ищет имя класса исключения ... Docs

$this->setExpectedException('Exception'); 

Это очень удобно, когда вы используете SPL Exceptions или классы пользовательских исключений .. .

+0

Спасибо! Я полностью забыл об этом, потому что я привык к способу SimpleTest. Знаете ли вы, есть ли простой способ проверить текст? –

+0

@Nathan, @ircmaxell: см. Мой ответ, есть лучший способ сделать это, включая тестирование текста. – ryeguy

+0

@ircmaxell: Я не согласен с тем, что сообщение не имеет значения. Вы не видите хорошо разработанных языков или фреймворков, которые создают новое исключение для каждой новой ошибки, которая появляется. Это будет слишком много работы. – ryeguy

13

Добавление ответа ircmaxell, есть на самом деле простой способ сделать это:

/** 
* @expectedException MyExceptionClass 
* @expectedExceptionMessage Array too small 
*/ 
public function testSomething() 
{ 
} 

@expectedException имя класса ожидаемого исключения, а @expectedExceptionMessage - подстрока сообщения об исключении, ожидающее (это верно, вам не обязательно иметь все сообщение).

Если вы предпочитаете не использовать аннотации докблока, то оба они действительно доступны как методы на тестовом примере.

+4

+1 ... Я не знал о '@expectedExceptionMessage 'элемент docblock ... Узнайте что-то новое каждый день ... – ircmaxell

+0

@ircmaxell: Да, я только что немного узнал его. Об этом нигде не упоминается, кроме как в приложении «Аннотации». Даже тогда на нем нет документов, он просто перечисляет свое имя. – ryeguy

+0

очень приятно - спасибо! – jmadsen

Смежные вопросы