次のような既存のアプリケーションに SessionManager クラスがあります。
public class SessionManagerBase<TKey>
{
public static void AddItem(TKey key, object item)
{
_httpContext.Session[key.ToString()] = item;
}
public static T GetItem<T>(TKey key)
{
object item = _httpContext.Session[key.ToString()];
return item == null ? default(T) : (T) Convert.ChangeType(item, typeof (T));
}
// etc...
private static HttpContextBase _httpContext
{
get
{
return new HttpContextWrapper(HttpContext.Current);
}
}
}
私の HomeController には、次のようなコードがあります。
public ActionResult Landing(string id)
{
SessionManager.GetItem<Campaign>(SessionKeys.Campaign)
// commented for brevity
return View("Index");
}
Landing メソッドで単体テストを実行すると、HttpContext.Current が null であるため、テストが失敗します。単体テストで Session オブジェクトをモックしました。Session に Landing メソッド (つまり、Session["SomeValue"]) で直接アクセスしようとすると、機能しますが、SessionManager に依存するコードは壊れています。
要するに、一般的で厳密に型指定された方法で Session 値にアクセスするために使用できるクラスが必要ですが、それは単体テストも可能です。それを達成するためにこのコードを変更する方法について誰か提案がありますか?