没有用phpUnit测试异常?

时间:2010-08-12 17:37:32

标签: php unit-testing zend-framework 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 个答案:

答案 0 :(得分:4)

我的猜测?从PC_Translate_MySQL::getInstance() ...

抛出异常

使用单个Exception时遇到了麻烦。这使得检查引发的异常变得更加困难。我建议更改changePassword方法以抛出不同的异常。也许是InvalidArgumentExceptionRuntimeException。然后测试那一个。

就个人而言,我个人一直使用自定义例外。

try {
} catch (DatabaseQueryException $e) {
    // Handle database error
} catch (DatabaseConnectionException $e) {
    // We never even connected...
} catch (InvalidArgumentException $e) {
    //...
}

我通常不会因为这个原因而使用catch (Exception $e)。你永远不知道你抓到了什么异常。 (我确实定义了一个自定义异常处理程序,所以如果应用程序没有捕获,我不会致命。而是显示500错误并记录异常)...