6

現在、ユニットテストに全力で取り組むことを妨げている最大の問題の1つは、私が作成するコードの非常に大きな割合が、相互作用する傾向のあるさまざまなソースからのサードパーティのCOMオブジェクトに大きく依存していることです(I ' m必要に応じて、いくつかのヘルパーライブラリを使用してMicrosoft Office用のアドインを作成します)。

私はおそらくモックオブジェクトを使用する必要があることを知っていますが、この場合、どのように正確にそれを実行しますか?既存のオブジェクトへの参照を渡す必要がある場合は比較的簡単ですが、一部のルーチンは外部COMオブジェクト自体をインスタンス化し、場合によっては別のライブラリから他の外部COMオブジェクトに渡すことがあります。

ここでのベストプラクティスのアプローチは何ですか?テストコードがレジストリ内のCOM登録情報を一時的に変更して、テストされたコードが代わりにモックオブジェクトの1つをインスタンス化するようにする必要がありますか?変更されたタイプのライブラリユニットを注入する必要がありますか?他にどのようなアプローチがありますか?

Delphiの例やツールには特に感謝しますが、より一般的なアドバイスやより高レベルの説明にも同様に満足します。

ありがとう、

オリバー

4

3 に答える 3

6

従来のアプローチでは、COM オブジェクトのインスタンス化を担当するラッパーをクライアント コードで使用する必要があります。このラッパーは簡単にモックできます。

COM オブジェクトを直接インスタンス化するコードの一部があるため、これは実際には適合しません。そのコードを変更できる場合は、ファクトリ パターンを使用できます。ファクトリを使用して COM オブジェクトを作成します。ファクトリをモックして、代替オブジェクトを返すことができます。

ラッパーを介してオブジェクトにアクセスするか、元の COM インターフェイスを介してオブジェクトにアクセスするかは、あなた次第です。COM インターフェイスをモックすることを選択した場合は、モックで IUnknown::QueryInterface をインストルメント化することを忘れないでください。これにより、特にオブジェクトが他の COM オブジェクトに渡される場合に、すべてのインターフェイスをモックしたことがわかります。

または、 CoTrateAsClassメソッドを確認してください。私はそれを使用したことはありませんが、必要なことはできるかもしれません。

于 2008-09-16T09:10:44.160 に答える
3

それは「テスト容易性のための設計」に帰着します。理想的には、これらの COM オブジェクトを直接インスタンス化するのではなく、モック オブジェクトに置き換えることができる間接レイヤーを介してアクセスする必要があります。

現在、COM 自体はある程度の間接性を提供しており、実際のオブジェクトの代替となるモック オブジェクトを提供できますが、作成するのは面倒であり、既存のモック フレームワークから多くの助けが得られるかどうかは疑問です。 .

于 2008-09-16T09:01:15.197 に答える
2

単体テストの状況で実際の COM オブジェクトではなくモック オブジェクトをロードする機能を持つ、サード パーティの COM オブジェクトの周りにシン ラッパー クラスを記述します。私は通常、モック オブジェクトを渡す 2 番目のコンストラクターを呼び出してこれを行います。通常のコンストラクターは、通常どおり COM オブジェクトをロードしただけです。

ウィキペディアの記事には、 ウィキペディアのアーティブルに関する優れた紹介があります

于 2008-09-16T09:04:17.280 に答える