Zend PHPUnit测试模型,断言Zend_Exception确实按预期发生

时间:2012-07-24 14:20:51

标签: zend-framework exception phpunit assert

在模型中考虑以下代码。函数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 assert that an exception was thrown?

Problem testing exceptions with PHPUnit and Zend Framework

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

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

1 个答案:

答案 0 :(得分:1)

您执行此操作的方式的一个问题是它接受任何异常,因为所有异常都从Exception继承。因此,您可能会错过一个错误,因为抛出的异常不是您预期的异常。

使用注释。

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

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