@rouenに同意します。Session["foo"] を直接使用しないでください。しかし、ValueProvider ans を持つことは実用的な解決策ではないかもしれないと思います。保存する変数はごくわずかであり、これらの値はおそらく完全なモデルではない可能性があります。したがって、私のアプローチは Vic Smith が示唆するものと似ていますが、より IOC (および Mock) に適しています。
セッション変数を取得するためのプロバイダー (つまり、サービス) を作成します。
public class SessionVariableProvider : ISessionVariableProvider
{
public object GetSessionValue(string key)
{
if (!HttpContext.Current.Session.IsNewSession
&& HttpContext.Current.Session[key] != null)
{
return HttpContext.Current.Session[key];
}
throw new ArgumentNullException(key);
}
public void SetSessionValue(string key, object value)
{
HttpContext.Current.Session[key] = value;
}
}
public interface ISessionVariableProvider
{
object GetSessionValue(string key);
void SetSessionValue(string key, object value);
}
コントローラーを変更して、ISessionVariableProvider をパラメーターとして期待します。
public class TestController: Controller
{
protected readonly ISessionVariableProvider _sessionVariableProvider;
protected InowiaControllerBase(ISessionVariableProvider sessionVariableProvider)
{
Guard.ArgumentNotNull(sessionVariableProvider, "sessionVariableProvider");
this._sessionVariableProvider = sessionVariableProvider;
}
public ActionResult Index()
{
_sessionVariableProvider.SetSessionValue("foo", "bar");
var foo2 = (string)_sessionVariableProvider.GetSessionValue("foo2");
return View();
}
}
テストするときは、ISessionVariableProvider の独自のテスト実装を作成し、コントローラーに渡します。