6

私が取り組んでいるいくつかのレガシーコードで PHPUnit モックオブジェクトを動作させようとしてきましたが、私が求めているオブジェクトのためにそれをサブインするのに問題があり、それが原因であると確信しています私はそれを間違って使用しています。

現在、クエリを作成するためだけに使用されるクラスがあります。別のクラスがクエリを作成したい場合、このクラスのオブジェクトを作成し、SQL とデータベースの詳細を渡します。私がやりたいことは、PHPUnit でこのオブジェクトをテスト可能なモック バージョンに置き換えることです。

私が見つけたのは、テストスクリプトでモックオブジェクトを作成すると、テストされているメソッドがそれをバイパスすることです。これは、メソッドがパラメーターとして渡されるのではなく、オブジェクトを作成してからローカルで使用しているためだと推測しています (この場合、パラメーターとして渡されたモック オブジェクトを使用してメソッドを参照できます)。以下は、コードがどのように見えるかの例です。

class SampleClass{
    function loadData(){
        $sql = "SELECT * FROM users";
        $query = new Query();
        $query->query($sql);
        while($row = $query->get_row()){
            if($row['email'] = ''){
                $this->errors[] = "Email missing from user ".$row['user_id'];
            }
            $result[] = $query->get_row();
        }
        $this->users = $result;
        if(count($user->errors) >= 1){
            return $user->errors;
        }else{
            return true;
        }
    }
}

class Query{
    function query($sql){
        $this->result = mysql_query($sql);
    }
    function get_row(){
        return mysql_fetch_assoc($this->result);
    }
}

PHPUnit テスト ファイルにモック オブジェクトを作成して、SampleClass の $query オブジェクトを、渡されるパラメータをテストし、応答を制御するために使用できるモック オブジェクトに置き換える方法はありますか? アプリケーション全体で広く使用されているため、クエリ クラスを置き換えたり、参照方法を変更したりすることはできませんが、少なくとも何らかの形式のテスト フレームワークを作成できるようにしたいと考えています。あなたが与えることができる助けをいただければ幸いです

テストしようとしているメソッドの一部である loadData メソッドでクエリが発生しているだけではないことを明確にするために編集されました。実際のデータベースにヒットするのではなく、メソッドが動作するサンプルデータの事前設定された配列を返すクエリクラスメソッド get_row の double にサブしたいと思っています

4

1 に答える 1

2

はい、可能です。

ただし、独自のスタブを作成することはできSampleClassます。Queryまた、依存関係のクラス名またはインスタンスも作成できます。だから、実際に注入することができます。その方が良い方法であり、テストを作成する方がはるかに簡単だと思います。

于 2012-07-09T16:55:38.900 に答える