3

私はテストが初めてで、実際のシナリオでテストがどのように実装されているかを理解したいと思っています。たとえば、内部フレームワークを実装し、メソッド チェーンを使用するこのコードがあります。一見、モッキングが最善の方法だと思いましたが、ほとんどの例は次のようになります。

public function someFunction(A $a)
{
    return $a * b;
}

ただし、私がテストしているコードは次のようになります。

public function deleteUser($user_id)
{
    $user_id = (int)$user_id;
    $flag = Framework::getInstance()->request->get('delete') || false;

    if (!$this->exists($user_id)) {
        throw new UserException(UserException::NOT_EXIST);
    }

    return $this->delete([
        'id' => $user_id
    ]);
}

どのようにテストしますか?

「 PHPUnit で依存関係のあるオブジェクトをテストする」を見てきましたが、実際のコードを変更することはできません。

4

1 に答える 1

3

簡単な答え: そのコードを単体テストすることはできません。静的メソッド呼び出しのためにコードが Framework クラスに結合されすぎているため、deleteUser()メソッドを分離してテストすることはできません。シングルトンを使用するコードのテストに関するこの記事では、状況がよく説明されています。

長い答えは、そのコードを単体テストすることはできませんが、統合テストや機能テストなどの有用なテストを作成することはできます。この質問を参照として使用できますが、基本的に、統合テストでは、コードのいくつかの部分を同時にテストします。この種のテストでは、クラスの依存関係を気にすることなく、ユーザーが削除されるという、このメソッドの予想される動作をテストできます。両方のクラス (テスト対象のクラスと Framework クラス) を一緒にテストしたいので、何もモックする必要はありません。

そうは言っても、コードを変更できないのはなぜですか?シングルトンを使用する代わりに、(最初の記事で述べたように) コードに依存関係を挿入することを強くお勧めします。

于 2013-03-21T18:42:58.797 に答える