2009-04-22 26 views
4

編集:言語/プラットフォームは、私は現在、私の現在のプロジェクトでの豊富なユニットテストの空白を埋めるためにしようと、確かに新しいものだのC#/。ネットモック非仮想イベント

ですTDDに、より重要なビジネス上の機能のいくつかをテストする方法についてはかなり困惑しています。

私はMoqをピックアップして簡単なモックをやっていましたが、私のアプリケーションの中核では、ユニットテストを適切に概念化するのが難しい、複雑で怖いCOMインターレイヤーがあります。 COMコンポーネントは完全に第三者であり、したがって変更することはできず、電話を処理するための有限状態マシンに相当するものを実装します。このコンポーネントは、仮想以外のイベントのセットを使ってアプリケーションに通知しますが、これは状態の変化をシミュレートするために特定のオーダーでテストしたいものですが、Moqは仮想イベント以外は何もしません。

もっと知識の豊富なTDDers/Mockistsへの私の質問は、です。どうやってこのようなことをテストするのですか?

明らかにTypeMockはこれをサポートしています(自分の欠点と引き換えに)。しかし、タイプセーフと私の背中の背後にある何かを嫌う一般的な感覚に関しては、それを使用していません。

答えて

4

あなたはTypeMockのような強力なものを使わない限り、仮想/抽象メソッドのみをモックできます。

制御権のないコードをテストする必要がある場合は、そのコードへの依存関係を解除する必要があります。テストできないクラスのメソッド、プロパティ、およびイベントを持つファサードを作成します。あなたが実際に使用するものに固執してください。あなたが書かなければならないコードのサイズを抑えます。あなたが管理していないコードではなく、自分が管理しているファサードに対してコーディングします。

最後に、いくつかのテクニックの1つを使用してファサードにアクセスし、テスト中にモックを置き換えることができます。設定ファイル、依存性注入フレームワーク、遅延インスタンス化などを使用することができます。これにより、ファサードをモックアウトして単体テストに使用できます。もちろん、あなたのファサードが実際のCOM interopクラスで正しく動作するように、いくつかの統合テストを行う必要があります。

いくつかのインスピレーションのために、System.Web.Abstractionsを見てください。これには、ASP.NETのコアクラスをラップする多くのクラスが含まれています。

+0

COMコンポーネントと抽象レイヤーの間にテスト可能な相互作用が常に存在するという点で、これはまだまだ問題の根幹になっているようです。たぶんTDDの哲学の私の理解は根本的に欠陥がある... – TheMissingLINQ

+1

Nope。あなたはかなり大丈夫です。しかし、もう一度、何も完璧ではありません。 – Will

関連する問題