4

編集:言語/プラットフォームはC#/ .Net

私は現在、現在のプロジェクトで膨大な単体テストの空白を埋めようとしていますが、TDDを初めて使用することは確かですが、ビジネスに不可欠な機能のテストを行う方法についてはかなり困惑しています。

私はMoqを手に取り、簡単なモックを作成するのに十分な時間を過ごしましたが、アプリケーションのコアにはかなり大きくて恐ろしいCOM相互運用レイヤーがあり、ユニットテストを適切に行う方法を概念化するのに苦労しています。COMコンポーネントは完全にサードパーティであるため、変更することはできず、電話を処理するための有限状態マシンに相当するものを実装します。コンポーネントは、状態の変化をシミュレートするために特定の順序でテストしたい一連の非仮想イベントを介してアプリケーションに通知しますが、Moqは仮想イベント以外に対してこれを行う方法を提供していません。

それで、より知識のあるTDDer / Mockistsへの私の質問は、この種のものをどのようにテストするのかということです。

どうやらTypeMockはこれをサポートしているようです(それ自体の欠点と引き換えに)が、型安全性と私の背後で何か悪意のあることをしているという私の一般的な感覚に関するさまざまな理由から、私はむしろそれを使用したくありません。

4

1 に答える 1

4

TypeMock のような重いものを使用しない限り、仮想/抽象メソッドのみをモックできます。

コントロールできないコードをテストする必要がある場合、そのコードへの依存を断つ必要があります。テスト不可能なクラスのメソッド、プロパティ、およびイベントを持つファサードを作成します。実際に使用しているものに固執してください。記述しなければならないコードのサイズを抑えることができます。制御していないコードではなく、制御しているファサードに対してコードを記述します。

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

インスピレーションについては、System.Web.Abstractions をご覧ください。ASP.NETコアクラスをラップしてモック可能にする多くのクラスが含まれています。

于 2009-04-22T18:37:13.930 に答える