5

動作をテストしたい保護されたメソッドを持つシールされたクラスがあります。これにより、直接テストすることも、モックすることも難しくなります。

これは、TDD 方式で開発されていないコードベースにあり、現在、特定の機能の単体テストを追加しています。

この場合、可能な一般的なアプローチは何ですか? 現時点で私は持っています:

  1. クラスをアンシールします。次に、テスト コード内のクラスから派生したプロキシまたはアダプターを作成して、保護されたメソッドへのアクセスをトンネリングします。
  2. 保護されたメソッドの動作をデリゲート/ファンクターに分解し、再注入します。次に、除外された動作を個別にテストします。
  3. 保護されたメソッドを使用する継承階層で最も近いパブリック メソッドを呼び出してテストします。多くのモッキングにつながる可能性があり、テスト対象のコード以外のコードが変更されたときにリスクにさらされる可能性があり、脆弱なテストが作成されます。
  4. リフレクションを使用して、保護されたメソッドにアクセスします。次に、直接呼び出します。

もうありますか?

4

5 に答える 5

8

封印されたクラスのprotectedメソッドは、事実上同じprivateです(基本クラスにメンバーがある派生クラスを封印すると、protectedこれらは自然に発生する可能性があります)。

そして、ポイントテストのprivate方法はありません。publicそれらは、定義するクラスのメソッドを介してアクセスできる以外の動作を持たないため、publicメソッドをテストすることによって動作をテストする必要がありpublicます。

于 2011-01-20T14:41:41.533 に答える
3

Microsoft Molesは、封印されていないクラスを非仮想メソッドでモックするのに役立ちます。プライベート メソッドをモックすることはできませんが、特定のクラスの外部で使用される高レベルのパブリック メソッドをモックでき、1 つのパブリック メソッドをモックする必要なすべての動作をエミュレートできるため、これは冗長です。

また、プライベート/保護されたメソッドをテストする必要があるのはなぜですか? これを実現するには、内部メソッドとInternalVisibleToAttributeを使用できます。しかし、一般的には、パブリックな動作のみ (つまり、パブリック インターフェイスのみ) をテストする必要があります。

于 2011-01-20T14:50:34.537 に答える
2

かなり簡単に変更できると仮定して、私は一般的に 2 番目のオプションを選択します。保護された /private メソッドがそのパブリック インターフェイスを介して行っていることをテストできない場合、おそらく単一責任の原則に準拠していない可能性があり、コードはおそらく 2 つのクラスに分割され、代わりにコンポジションを使用する可能性があります。

于 2011-01-20T14:44:29.937 に答える
1

JustMock フレームワークを使用できます。例えば:

double value = 0;
var fakeFilterSetHelper = Mock.Create<FilterSetHelper>(Behavior.CallOriginal);
Mock.NonPublic.Arrange<double>(fakeFilterSetHelper, memberName: "GetPriceRangeFromSession").Returns(value);
于 2016-09-13T16:33:21.623 に答える
1

モック用のフレームワークを使用できます。たとえば、JustMock (Telerik による) は、封印されたプライベート メソッドのモックをサポートしています... 残念ながら、JustMock のこの部分は有料だと思いますが、少なくとも試用版を試すことができます。

于 2011-01-20T14:38:54.253 に答える