2

一般に、私はテスト目的でプライベートへのアクセスを必要としないような方法でクラスを設計します。アンInternalsVisibleToもお手伝いします。

ただし、現在、[VSTS のプライベート アクセサー メカニズム]( http://msdn.microsoft.com/en-us/library/ms184807(VS.80 .aspx) (つまり、リフレクションを使用してクラスのメンバー (およびオプションでメンバーも)を呼び出す転送を持つクラスをVSCodeGenAccessors生成するために使用します。*_Accessorprivateinternal

だから私は次のようなコードを持っています:

ClassUnderTest target = new ClassUnderTest();
var accessor = ClassUnderTest_Accessor.AttachShadow( target );
accessor.PrivateMethod();
Assert.True( accessor._privateMethodWasCalled);
accessor.PrivateProperty = 5;
Assert.Equal( accessor.PrivateProperty, 5);

(はい、アンチパターンだらけですが、メッセンジャーを撃たないでください)

これにはいくつかの問題があります。

  1. 必要なプライベートを明確にしたい
  2. ダイアログを呼び出したくない (はい、私は CRaholic です)
  3. 写真にコード生成を含めたくない

したがって、上記のコードを次のように変換できるようにしたいと思います。

var target = new ClassUnderTest();
IClassUnderTestInterface accessor = Shadow.Create<IClassUnderTestInterface>( target );
accessor.PrivateMethod();
Assert.True( accessor._privateMethodWasCalled);
accessor.PrivateProperty = 5;
Assert.Equal( accessor.PrivateProperty, 5);

私のテストアセンブリには次のインターフェイスのみがあり、生成されたコードやカスタムビルドステップはありません:-

interface IClassUnderTestInterface
{
   int PrivateProperty {get; set;}
   bool _privateMethodWasCalled {get; }
   void PrivateMethod();
}

そこから、CodeRush または Ctrl KM を使用して、キーストロークのみでインターフェイスに新しいシャドウ メソッドを生成できます。

I Shadow.Create<I>( Object o)1. インターフェースを実装する動的プロキシを生成する 1. ラップされるオブジェクトが、インターフェースによって指定されたすべてのメンバーを持っていることを確認する1. bnous o: フィールドを表すプロパティの転送を管理する (つまり、 、`_privateMethodWasCalled' ケース) 正しく

それで、誰かがこのようなものを実装するライブラリを知っていますか(またはそれを書くのに十分退屈ですか?)

明らかな欠点の 1 つは、実行時までインターフェイスが ClassUnderTest と互換性がないかどうかわからないことですが、これはテスト専用であるため問題ありません。また、プライベート アクセサー メカニズムである AIUI も、時々同期するために再コンパイルをトリガーする必要があります。

または、私が見逃しているより良い方法がありますか? (すべてのプライベートを内部またはパブリックに一括アップグレードしたくないこと、および作業コードを書き直す必要がないことを思い出してください)

xUnit.net、.NET 3.5 を使用。任意の動的プロキシ ライブラリまたはその他の使用にオープン

4

3 に答える 3

1

MoqやRhinoのようなモックフレームワークを見たことがありますか?あなたの場合、あなたがテストする必要のあるプライベートを「保護された仮想」に変更することをいとわないなら、彼らは助けることができます(これは内部の公開になるほど悪くはありません)。基本的に、メンバーが仮想の場合、モックフレームワークはメンバーの呼び出しを記録するサブクラスを生成できます。

于 2009-06-26T12:34:54.663 に答える
1

テストをメインプロジェクトにマージし、何かを作成することにより、これらすべてのもの(InternalsVisibleTo、個別のテストプロジェクト、テスト参照、プライベートアクセサー、ビルドでランダムに失敗するMSBuildシャドウタスク/ publicize.exe、リフレクションを使用してプライベートにアクセスする)をルーティングすることになりましたテストからアクセスする必要がありましたinternal)。xUnit.net Test Stripper [展開/出荷前にバイナリに埋め込まれたテスト コードを削除する]も参照してください。

于 2009-11-26T16:38:48.763 に答える
0

本質的に手動ですが、転送機能をより簡潔にすることができるこの巧妙なトリック

また、この回答では、メンバーの処理方法についても説明していますstatic(ただし、私の質問の時点では使用されていなかった CLR4 が必要でありInternalsVisibleTo、混在させずにプライベート メソッドを処理することはできません)。

于 2010-02-12T09:27:13.823 に答える