关于异常:Zend PHPUnit测试模型,断言Zend_Exception确实按预期发生

Zend PHPUnit testing a model, asserting a Zend_Exception indeed occurs as expected

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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时确实触发了异常。 测试类中的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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测试异常的问题

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

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


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

使用注释。

1
2
3
4
5
6
/**
 * @expectedException Zend_Exception
 */
public function testDeleteNull(){
$this->_users->deleteUser(NULL);
}

您可能希望创建自定义异常类以使其更准确。 有些人会争辩说,使用exceptedException你不能断言异常消息,他们是对的。 简单来说,没有通用和"正确"的解决方案。