Исключение не проверялось с phpUnit?
Я пишу некоторый модульный тест с phpUnit для тестирования приложения Zend Framework, и у меня есть некоторые проблемы с тестированием исключения в функции changePassword. Тест не дает сбоя, но в инструменте покрытия, который генерирует html, "выбросить новое исключение ($tr->translate('userOldPasswordIncorrect'));" линия не проверена
public function changePassword(array $data, $id)
{
$user = $this->_em->find('Entities\User', (int) $id);
$oldPassword = sha1(self::$_salt . $data['oldPassword']);
if ($user->getPassword() !== $oldPassword) {
$tr = PC_Translate_MySQL::getInstance();
throw new Exception($tr->translate('userOldPasswordIncorrect'));
}
$user->setPassword(sha1(self::$_salt . $data['password']));
$this->_em->persist($user);
$this->_em->flush();
}
Модульный тест, который должен проверить исключение:
/**
* @depends testFindByAuth
* @expectedException Exception
*/
public function testChangePasswordWrongOldPassword()
{
$this->_dummyUser = $this->_user->findByAuth($this->_dummyEmail, $this->_dummyPassword, $this->_reseller);
// Try to change the password with a wrong oldPassword
$data['oldPassword'] = 'wrongOldPassword';
$data['password'] = $this->_dummyNewPassword;
$this->_user->changePassword($data, $this->_dummyUser->getId());
}
Я надеюсь, что кто-нибудь скажет мне, что я делаю неправильно.
Обновить
Проблема была в методе PC_Translate_MySQL::getInstance(). Было выброшено исключение. И когда я тестировал получение общего исключения, этот курс прошел. Решение не использует общее исключение в методе changePassword.
1 ответ
Моя догадка? Есть исключение из PC_Translate_MySQL::getInstance()
...
Вот в чем проблема с использованием одного Exception
, Сложнее проверить, какое исключение было сгенерировано. Я бы предложил изменить changePassword
метод бросить другое исключение. Возможно InvalidArgumentException
или RuntimeException
, И затем проверить это.
Лично я по этой причине все время использую пользовательские исключения.
try {
} catch (DatabaseQueryException $e) {
// Handle database error
} catch (DatabaseConnectionException $e) {
// We never even connected...
} catch (InvalidArgumentException $e) {
//...
}
Я, как правило, никогда не пользуюсь catch (Exception $e)
по этой самой причине. Вы никогда не знаете, какое исключение вы поймали. (У меня есть определенный обработчик исключений, поэтому я не фатальный, если приложение не перехватывает. Вместо этого оно показывает ошибку 500 и регистрирует исключение)...