使用工場を置き換えインスタンスによる偽物から単離枠組み
-
22-09-2019 - |
質問
一ヶ月前に仕上げました読書籍"アートのユニット試験"及び本日の私のための時間の使用を開始サイ疑似とのユニット試験サービスに送信/受信メッセージデバイス(UDP)の省/負荷データからのデータベースです。
オフコースをしたいの分離のデータベースをUDPです。
例えば、データベースアクセスして一部のクラスのstaticメソッド、電話として
- AreaADBAccess
- AreaBDBAccess
- AreaCDBAccess
これらのクラスが静的メソッドが実行され、データベースにアクセス。
できるスタブをした方法公virtualなのです。
それでリファクタリングのコードの交換はできるインスタンスのこれらのクラスのコードです。
るようにして、別のものでその結ファクトリクラスがるようでとても簡単です。
public class ObjectFactory
{
private static Dictionary<Type, object> Instances = new Dictionary<Type, object>();
public static T GetInstance<T>() where T : new()
{
if(Instances.ContainsKey(typeof(T)))
return (T)Instances[typeof(T)];
return new T();
}
public static void SetInstance<T>(object obj)
{
Instances[typeof(T)] = obj;
}
}
次のコードを使えばいいじゃないか
private AreaADBAccess DBAccess = ObjectFactory.GetInstance<AreaADBAccess>();
および試験方法で次のように
AreaADBAccess dbAccess = mocks.Stub<AreaADBAccess>();
using (mocks.Record())
{
...
}
ObjectFactory.SetInstance<AreaADBAccess>(dbAccess);
//Invoke the test method
...
これは最初の溶液を実現できることとなるよう設計されていております。
ですが現在コメントでも最良の慣行?
きましても説明していますのでっかいたいと思っていインターフェースで定義の方法で仮想として?このような繰り返しの方法ヘッダーを2ヶ所。
よろしく!
解決
おそらくあなたは、あなたの人生ははるかに容易になるだろうこれは、ウィンザー、のStructureMapまたはNinject、などのIoCコンテナの使用を作ることができ、実際に彼らはまた、作品は「工場」として手動で作成しているが、はるかに強力です。
また、コードの追加行を保存し、あなたのテストは壊れにくくすることができますので、自動的にあなたのクラスのモックの依存関係を作成しますautomockingコンテナがあります。
は代わりのクラスのインタフェースの必要性に関する問題については、より高いレベルのモジュール(クラス)が低レベルモジュール(クラス)に依存してはならないことを述べ、その基本的依存性逆転原理は、それらの両方は、抽象化に依存するべきです。インタフェースは、これらの抽象化したものです。 私は、少なくとも、彼らが私にしたあなたは、あなたの人生ははるかに容易になりますS.O.L.I.Dの原則を見てみましょうお勧め..