依存関係の注入、単体テスト、情報の隠蔽 [終了]
-
20-09-2019 - |
質問
Bar 型のプライベート メンバーを持つクラス Foo があるとします。Foo の実装に Bar が含まれていることをユーザーに知られたくないし、ユーザーが独自の Bar を作成して、それを Foo のコンストラクター、その他のメソッド、または構成ファイルに渡すこともできたくないでしょう。
編集:Bar は、特別なデータベース、ネットワーク接続、または別のプロセスなど、テスト環境の制御外のリソースにアクセスするという点でも問題があります。
Foo の単体テストもできるようにしたい場合はどうしますか?依存関係の注入はまだ可能ですか?これは、Bar と Foo が (依存関係が一方向であっても) あまりにも密接に結合しており、この状況は決して許容できるものではないことを意味するのでしょうか?
解決
【特記事項:なぜなんだろうと思って Typemock]
て三つの選択肢:
- を内蔵方法を設定するバークラスを使用InternalVisibleToのassemblyInf.csファイルを得ることができテストの設定とクラスです。
- 使用DI注入り、バークラスは、試験中の変動がシェイクスピアの"マクベス"ダミーは訪れます。
- 利用捏/嘲笑う枠組みのようにTypemockアイソレータ(.純)をつけることができるようになる偽りの行動で作成したオブジェクト内の別のクラスを使用
Isolate.Swap.NextInstance<Bar>.With(fakeBar);
他のヒント
依存関係はできる限り隠したくないものです。
自分のコードの場合は、再設計して依存関係を明示する必要があります。 Bar
高価なリソースに直接アクセスするのではなく、高価なリソースによって生成されたオブジェクトを受け入れるには:データベース アクセス コード (またはそれが何であれ) を外に移動します。 Bar
そして中に Foo
, 、ここでテストダブルを挿入できます。
それが現実的でない場合 (つまり、他の人のクラスを扱っている場合)、 ドクターのリスト とても良い。
バータイプがfooの単なる実装の詳細であれば、あなたのユニットテストは、彼らが唯一とにかくはFooのパブリックインターフェイスを行使しなければならないので、バーの作成を心配する必要はありません。
EDIT:バーは、外部リソースにアクセスする場合、私はそれはFooのための明示的な依存関係作り、その後、簡単にユニットテストのために嘲笑することができフーのコンストラクタに渡されるインスタンスが必要になります。
。あなたの問題は、プライベートメンバにアクセスする必要があるということではありません。それは、問題のクラスは、のはの隔離されるように設計されていないという事実の唯一の症状です。これは、高価なだけのリソースに行くオブジェクトをnew
することで1回の非常に特定の使用が可能になります。
あなたがテスト不能デザインの周りハッキングに成功した場合でも、唯一の統合テストをやってます。単体テストは、統合の反対で隔離、約です。そのクラスを単離することができないので、定義によって、あなたはユニットがそれをテストすることはできません。
依存関係を外部化することは望ましくないという理由はありますか?何このオブジェクトに関する依存関係を注入し、他と同様であることから、それを免除?
編集
私はのいくつかの策略でそれを分離することができますが、をそのコースの実現します。しかし、これらの技術は、将来の柔軟性を制限し、(基本的には、民間のメンバーの有用性を無効化)、誰かがそれを破る可能性を高め、パブリックインターフェイスをバイパスします。