【问题标题】:Exception not tested with phpUnit?没有用 phpUnit 测试异常?
【发布时间】:2011-03-29 01:53:41
【问题描述】:

我正在使用 phpUnit 编写一些单元测试来测试 Zend Framework 应用程序,但在 changePassword 函数中测试异常时遇到了一些问题。测试没有失败,但在生成 html 的覆盖工具中,“throw new Exception($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 方法中使用一般异常。

【问题讨论】:

  • testFindByAuth 通过了吗?如果没有,depends 甚至不会让 testChangePasswordWrongOldPassword 运行。

标签: php unit-testing zend-framework phpunit


【解决方案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 错误并记录异常)...

【讨论】:

  • 一定是这样。但随后代码覆盖率报告会显示实际遇到的异常...
  • 会吗?当然它会增加抛出异常,但是如果像我一样你有一堆测试,你会注意到对异常的访问是 240 次而不是 239 次吗? AFAIK,覆盖率报告(HTML 或 XML)没有显示实际抛出的异常,只显示了哪些行被覆盖(因此 OP 知道要问这个问题)......
  • 确实有异常。单元测试时没有 $_SERVER['SERVER_NAME'];谢谢!
猜你喜欢
  • 2020-12-21
  • 2014-07-07
  • 2015-10-17
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2014-08-21
相关资源
最近更新 更多