代码之家  ›  专栏  ›  技术社区  ›  tom

未使用phpUnit测试的异常?

  •  3
  • tom  · 技术社区  · 14 年前

    我正在用phpUnit编写一些单元测试来测试Zend框架应用程序,在测试changePassword函数中的异常时遇到了一些问题。测试没有失败,但是在生成html的coverage工具中,“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\u Translate\u MySQL::getInstance()方法内部。引发了异常。当我测试得到一个一般的异常时,这个当然通过了。解决方案在changePassword方法中不使用常规异常。

    1 回复  |  直到 14 年前
        1
  •  4
  •   ircmaxell    14 年前

    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)