1

他の静的メソッドを使用するメソッドのテストが難しい理由が理解できたと思います。私がテストと言うとき、私は単体テストを考えています。

次の例を見てください。

クラス foo {
  保護された $objA;
  パブリック関数 m1() {
    $objA = 新しい A();
    $objA->show();
  }

  パブリック関数 m2() {
    ショー();
  }

  パブリック関数 m3() {
    $this->objA->show();
  }

  パブリック関数 m4($objA) {
    $objA->show();
  }

}
  • m1 は簡単にテストできますか? そのオブジェクトをモックできないからではないと思います。
  • m2 は、スタティックがテストを困難にするケースですか?
  • m3 はテスト可能な良い方法ですか?
  • m4 はテスト可能な良い方法ですか?

私はこれを正しく理解しましたか?

4

1 に答える 1

1

メソッド自体にクラスへの具体的な参照があるため、M1 は完全ではありません。そのため、それをモックできないという点で正しいです。この状況では、依存性注入を使用してオブジェクト参照をメソッドに渡す必要があります。

M2 は具象参照を使用しているという点でほぼ同じ状況ですが、ご指摘のとおり、代わりに静的メソッドを使用しています。静的メソッドを定義するインターフェイスを作成する方法がないため、静的メソッドをモックするのは困難です (私は .Net の背景から話しています。PHP で静的メソッドをインターフェイスできるかどうかはわかりませんが、疑いがあります)。

M3、プロパティ インジェクションを使用しているように見えます。その場合、オブジェクトはクラス自体の外でインスタンス化されて渡されるため、これは簡単にモックできるテストです。

M4 は M3 と同じです。これは、依存性注入がメソッド パラメーターの形式で行われるためです。

依存性注入は、プロパティまたはコンストラクター パラメーターを使用して、クラス レベルで行うのが理想的です。少なくとも私の観点からは、プロパティの注入は少し緩いのに対し、コンストラクターの注入では、必要なすべての依存関係を持つクラスを作成する必要があるため、コンストラクター パラメーターは一般的に推奨される方法と見なされます。

于 2013-05-12T17:34:28.510 に答える