私は単体テストに本当に慣れていないので、調査に膨大な時間を費やしましたが、自分の場合に適切な方法を見つけることができません。
私のコード ベースは巨大で (約 3 年間の作業)、非常に結合されており、残念ながらテストが難しく、ユニット テストが行われたことはありません。
たとえば、コレクション クラスProductCollection
、より具体的にはそのクラスをテストしようとするbool MoveElementAtIndex(Product productToMove, int newIndex)
と、次の問題が発生します。
- まず、これを初期化する必要があります
new ProductCollection()
- コンストラクターは、別の手作りのクラスを初期化します:
new KeyedList<ID, Product>
. 私はテストしていないので、これはこのコンストラクター内で呼び出されるべきではないと思いますKeyedList
。 - 次に、これに 3 つの製品を追加しようとしてい
ProductCollection
ます。 - 次に、これら 3 を最初に作成します
new Product()
。 - しかし、
Product
クラスのコンストラクターはいくつかのことを行います - 新しく作成された製品の一意の ID を計算します:
this.ID = IDUtils.ComputeNewIDBasedOnTheMoonPhase()
. 私の範囲ではないので、これもテストすべきではないと思います。このレベルの深さでそのような呼び出しを回避するにはどうすればよいですか? - 同じ Product コンストラクターが、この製品にいくつかの既定のプロパティを割り当てます:
this.Properties = new ProductProperties(folderPathToDefaultProperties)
.FieldCollection.MoveElementAtIndex
これは私の単純なテストから呼び出されるべきではありませんよね? - ようやく製品オブジェクトを手に入れ、コレクションに追加しようとしているとしましょう。
- ただし、
ProductCollection.Add(MyProduct)
基礎にKeyedList
既に製品が含まれているかどうかを確認します。これは、私のテストとは関係なく、避けるべきビジネス ロジックでもあります。問題はどのようにですか? - また、この
Add
メソッドでは、いくつかのイベントが発生し、いくつかのこと (たとえば、新しい製品がコレクションに追加されたこと) についてシステムに通知されます。これらもまったく解雇されるべきではないと思います。 - そして最後に、製品を追加したら、必要な SUT を呼び出します: move elements メソッドです。
- しかし、このメソッドには、私のテストの範囲外になる可能性のあるロジックもあります。基になる
KeyedList
フィールドに実際にこれらのフィールドが含まれていることを確認し、その移動ロジックに対して を呼び出しKeyedList.Remove()
、のようなイベントを発生させます。KeyedList.Insert()
CollectionModified
この単体テストを適切に行う方法、基になるオブジェクトが呼び出されないようにする方法を説明していただければ幸いです。
Microsoft の Moles フレームワーク (VS2010) について考えています。これは絶対に選択肢ではないため、すべてをリファクタリングする必要がないという印象があるからです。しかし、すでに試してみても、まだ適切な使用方法が見つかりません。
また、この具体的な例は私の状況で多くの人を助けるという印象を持っています.
何かご意見は?