0

考虑模型中的以下代码。函数 deleteUser(NULL) 将触发异常。

class Model_UserModel extends Zend_Db_Table_Abstract{
    protected $_name = 'users';
    protected $_primary = 'id';
    public function deleteUser($id){
    $row=$this->find($id)->current();
        if($row){
            $row->delete();
            return true;
        }else{
            throw new Zend_Exception("Delete function failed; could not find row!");
        }
    }   
}

我使用 PHPUnit 来测试这段代码,我想检查当 NULL 传递给函数 deleteUser 时是否确实触发了异常。测试类中的代码如下:

class Application_Model_UserModelTest extends PHPUnit_Framework_TestCase{
    ...
    //deleting a user with ID=NULL should fail
    public function testDeleteNull(){
        $e = null;
        try{
            $this->_users->deleteUser(NULL);
        }catch (Exception $e) {}
        if($e) {
            $this->assertTrue(TRUE);
        }else{
            $this->assertTrue(FALSE);;
        }
    }

虽然这似乎可行,但我想知道是否有更好的方法来做到这一点。我审查了以下问题:

PHPUnit 断言抛出异常?

使用 PHPUnit 和 Zend Framework 测试异常的问题

但我没有完全理解它们/看看在这种情况下如何应用(测试模型,而不是控制器)。

是否有更好的测试异常的方法被抛出?任何建议将不胜感激。

4

1 回答 1

1

你这样做的一个问题是它接受任何异常,因为所有异常都继承自 Exception。因此,您可能会错过一个错误,因为抛出的异常不是您预期的异常。

使用注释。

/**
 * @expectedException Zend_Exception
 */
public function testDeleteNull(){
$this->_users->deleteUser(NULL);
}

不过,您可能希望创建更准确的自定义异常类。有些人会争辩说,使用 exceptedException 你不能断言异常消息,他们是对的。根本就没有通用和“正确”的解决方案。

于 2012-07-27T08:40:52.117 回答