一般に、私はテスト目的でプライベートへのアクセスを必要としないような方法でクラスを設計します。アンInternalsVisibleTo
もお手伝いします。
ただし、現在、[VSTS のプライベート アクセサー メカニズム]( http://msdn.microsoft.com/en-us/library/ms184807(VS.80 .aspx) (つまり、リフレクションを使用してクラスのメンバー (およびオプションでメンバーも)を呼び出す転送を持つクラスをVSCodeGenAccessors
生成するために使用します。*_Accessor
private
internal
だから私は次のようなコードを持っています:
ClassUnderTest target = new ClassUnderTest();
var accessor = ClassUnderTest_Accessor.AttachShadow( target );
accessor.PrivateMethod();
Assert.True( accessor._privateMethodWasCalled);
accessor.PrivateProperty = 5;
Assert.Equal( accessor.PrivateProperty, 5);
(はい、アンチパターンだらけですが、メッセンジャーを撃たないでください)
これにはいくつかの問題があります。
- 必要なプライベートを明確にしたい
- ダイアログを呼び出したくない (はい、私は CRaholic です)
- 写真にコード生成を含めたくない
したがって、上記のコードを次のように変換できるようにしたいと思います。
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 を使用。任意の動的プロキシ ライブラリまたはその他の使用にオープン