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 を使用してこのコードをテストし、関数 deleteUser に NULL が渡されたときに例外が実際にトリガーされることを確認したいと考えています。テスト クラスのコードは次のようになります。

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 に答える