基本的に2つの方法があります。
.NET 3.5以降を使用していると仮定します。 HttpSessionStateBaseオブジェクトをコンストラクタパラメータとして使用するように実装を変更すると、この実装を模擬することができます。これを行う方法については、オンラインのチュートリアルがいくつかあります。テストの縫い目を作成することです
public class MyObjectThatUsesSession
{
HttpSessionStateBase _session;
public MyObjectThatUsesSession(HttpSessionStateBase sesssion)
{
_session = session ?? new HttpSessionStateWrapper(HttpContext.Current.Session);
}
public MyObjectThatUsesSession() : this(null)
{}
}
また、おそらく少し良く、より柔軟な設計:あなたはその後、アプリの起動時にこれを線等何か(貧乏人の依存性注入)を行うためにIoCコンテナを使用することができます他のオブジェクトのセッションとの対話をラップすることによって、その後、これをデータベース、Cookie、キャッシュベースの実装に変更することができます。何かのように:あなたは、あなたのテストのためのモックIStateStorageの実装を作成したり、簡単な辞書ベースの実装を作成するために部品番号を使用することができます
public class MyObjectThatUsesSession
{
IStateStorage _storage;
public MyObjectThatUsesSession(IStateStorage storage)
{
_storage= storage ?? new SessionStorage();
}
public MyObjectThatUsesSession() : this(null)
{}
public void DoSomethingWithSession()
{
var something = _storage.Get("MySessionKey");
Console.WriteLine("Got " + something);
}
}
public interface IStateStorage
{
string Get(string key);
void Set(string key, string data);
}
public class SessionStorage : IStateStorage
{
//TODO: refactor to inject HttpSessionStateBase rather than using HttpContext.
public string Get(string key)
{
return HttpContext.Current.Session[key];
}
public string Set(string key, string data)
{
HttpContext.Current.Session[key] = data;
}
}
。
希望に役立ちます。
私は貧しい男DIの類推が好きです。:) – theusguy