在模型中考虑以下代码。函数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
但我没有完全理解它们/看看在这种情况下它是如何适用的(测试模型,而不是控制器)。
抛出任何更好的方法来测试异常? 任何建议将不胜感激。
答案 0 :(得分:1)
您执行此操作的方式的一个问题是它接受任何异常,因为所有异常都从Exception继承。因此,您可能会错过一个错误,因为抛出的异常不是您预期的异常。
使用注释。
/**
* @expectedException Zend_Exception
*/
public function testDeleteNull(){
$this->_users->deleteUser(NULL);
}
您可能希望创建自定义异常类以使其更准确。有些人会争辩说,使用exceptedException你不能断言异常消息,他们是对的。对于它来说,根本没有普遍和“正确”的解决方案。