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你不能断言异常消息,他们是对的。 简单来说,没有通用和"正确"的解决方案。