2

私のコードは、その奥深くでシングルトン パターンを使用するサード パーティのライブラリを使用しています。最初のアクセス時に、ライブラリは Windows 環境変数を使用して、ロード元の構成フォルダーを識別します。

ただし、単体テストのさまざまなセットでさまざまなフォルダーに対して実行したいと考えています。理想的には、すべての単体テスト クラスなどの構成フォルダーを指定します。

サード パーティのライブラリは巨大なオブジェクト モデルであり、私のコードはそれらの上にある拡張メソッドのセットにすぎません。ライブラリ全体を簡単にモックアウトする方法はありません。

テスト クラスごとに新しい appdomain を作成する方法はありますか? ロード テストには、実行中のテスト アセンブリ間にドメインを作成するための設定があることを知っています。私の場合、それは多くのアセンブリになり、単体テスト testrunner でこの設定を設定できるかどうか、またはどのように設定できるかはよくわかりません。

または、Typemock Isolator または JustMock のいずれかを購入して、シングルトンが「null」を返すようにすることを検討しており、その結果、サードパーティのライブラリが新しいものをロードします。逆コンパイルされたコードを調べたところ、目的の結果が得られたようです。もちろん、そこにはもっと「いいもの」が隠されているかもしれません。

これらは不自然なアプローチです。私が本当に望んでいるのは、テスト、テスト クラス、またはテスト アセンブリ間で完全な appdomain を "フラッシュ" することです。

自動テストで構成フォルダーを切り替える必要がある場合は、速度を犠牲にしてもかまいません。red-green-refactor サイクルには、おそらく複数の構成フォルダーが含まれることはありません。

これを達成する方法について何か提案はありますか?

EDIT 異なるテスト アセンブリによってシングルトンが消去されることを発見しました。したがって、テストの対象となる依存関係や問題のドメインではなく、実行する構成に従ってテスト アセンブリを整理することができます。

4

2 に答える 2

2

(統合テストなどではなく) 真の単体テストを行う場合は、外部依存関係をラップすることをお勧めします。

ライブラリ全体を簡単にモックアウトする方法はありません。

Facade パターンを見てください。巨大なオブジェクト モデルがあるとおっしゃいました。あなたのコードがこれのほんの一部とやり取りしている可能性があります。ファサードを宣言型にすることを検討してください。そのメソッドは、どのように達成するかではなく、何を達成しようとしているのかを記述します。ファサードは汎用である必要はありません。アプリケーションで機能する必要があります。

ファサードが 1 つ以上のインターフェースを実装していることを確認してください。一般に、具体的な実装のインスタンスを返す 1 つ以上のファクトリが必要になります。

コードの残りの部分はすべてファサードのみを使用します。ファクトリは 1 か所でのみ呼び出す必要があります (または、ファクトリ インターフェイスを追加できます)。他のすべてはDependency Injectionによって行われます。

残りのクラス (ファサード以外のすべて) を単体テストするには、モック オブジェクトを挿入します。

ラッパー コードは非常に薄いレイヤーにする必要があります。実際のライブラリに対してそれを統合テストする必要があります。

于 2012-01-08T17:11:35.153 に答える
1

さまざまなテストアセンブリに分散しています。

単体テストクラスを異なるテストアセンブリに分散すると、テストランナーによって新しいアプリドメインが作成されるため、シングルトンが消去されます。したがって、テストの対象となる依存関係や問題ドメインではなく、実行する構成に従ってテストアセンブリを編成することができます。


ただし、次の理由により、このソリューションはすべての人に適しているとは限りません。

これは、(さまざまなテストデータ用の)テストプロジェクトが豊富な厄介なソリューションを作成する危険があります。結果として得られる構造は、コンポーネントおよび問題ドメインごとに単体テストを編成するという標準的な慣習に反しています。

シングルトンのデータには触れていません。これは単なるバッキングデータ参照ライブラリです。単体テストの主な指示は、それらが相互に影響を及ぼしたり、特定のシーケンスを必要としたりしてはならないということです。

単体テストのもう1つの主要な指示は、それらが高速に実行されることです。幸い、通常の赤->緑->リファクタリングサイクルで複数のテスト構成に対して実行する必要はありません。テストアセンブリのより大きなスイートは、回帰テストになります。

于 2012-01-08T10:44:15.740 に答える