3

単体テストを作成しているときに、クラスをリファクタリングしています。私のメソッドの1つが、テストしているこのクラスに注入された別のオブジェクトのメソッドを完全に呼び出している場合があります。

だから私はクラスに注入したオブジェクトをモックする必要があります。

さて、問題は、この特定のメソッドの単体テストを作成する価値があるかどうかです。そのオブジェクト自体をモックする必要がある他のオブジェクトのメソッドを呼び出す単体テストを作成するのは奇妙に思えますが、なぜこのメソッドをテストするのですか?

テストの目的は、メソッドの機能が期待どおりに機能するかどうかを確認することではありませんか?もしそうなら、私がそれをすべて嘲笑していて、テストする特定の方法が残っていないとき、なぜ私はテストする必要がありますか?

私は本当に混乱しています!

私が立ち往生している方法はこれです(これはカスタムセッション処理に使用されます):

public function write($sessionId, $sessionData)
{
    $sth = $this->databaseConnection->prepare("INSERT INTO `{$this->DBTableName}` (`session_id`,`session_name`,`session_data`) VALUES(:session_id, :session_name, :session_data) ON DUPLICATE KEY UPDATE `session_data`=:session_data;");
    $sth->bindValue(':session_id', $sessionId);
    $sth->bindValue(':session_name', $this->sessionName);
    $sth->bindValue(':session_data', $sessionData);

    return $sth->execute();
}

このコードへのリンクもここにあります:http: //pastebin.com/1FBeU6mb

ちなみに、私はクラスのテストを書き始めたばかりで、この分野のテストの初心者であり、経験が浅いです。

前もって感謝します。

4

3 に答える 3

2

私はPHPにあまり詳しくありませんが、データベースクエリを作成して実行しているようですよね?

このメソッドとデータベースの間に、後で私が見ない他のレイヤーがない限り、ここでモックする価値のあるものは実際にはありません。ですから、ここでのモックはあなたに多くの価値を与えないという意味であなたは正しいです。そして、ある意味では、このメソッドのテストは、実際にはデータベースレイヤーをテストしているだけなので、価値が限られています。これは、一般に、すでに正しく安定していると見なすことができるため、テストは必要ありません。

一般にモックの価値は、他のメソッドが実行していることを想定することでテストを簡素化し、他のメソッドを間接的にテストする必要がないことです。

writeメソッドのテストを選択する際にテストしているのは、正しい結果を返すための正しい手順が整っていることです。それでおしまい。私はphpモックフレームワークに精通していませんが、他の言語のフレームワークでは、期待値と呼ばれるものを設定できます。これにより、特定のメソッドが特定のパラメーターを使用して特定のオブジェクトで呼び出されるように指定できます。多くの場合、実行する順序を指定することもできます。ここでのポイントは、オブジェクトが送信している送信メッセージをテストしていることであり、それらのメッセージの戻り値ではありません。

それが価値があるかどうか、またはこのテストに必要なメンテナンスを決定するのはあなた次第です。

于 2013-02-22T22:16:45.313 に答える