Исключение не проверялось с phpUnit? - PullRequest
3 голосов
/ 12 августа 2010

Я пишу некоторый модульный тест с 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 Ответ

4 голосов
/ 12 августа 2010

Мое предположение?Исключение выдается из 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 и регистрирует исключение) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...