Есть два основных способа сделать это.
Предполагается, что вы используете .NET 3.5 или выше.Измените вашу реализацию так, чтобы она принимала объект HttpSessionStateBase в качестве параметра конструктора. Затем вы можете смоделировать эту реализацию - в Интернете есть несколько учебных пособий о том, как это сделать.Затем вы можете использовать контейнер IoC, чтобы подключить это при запуске приложения или сделать что-то вроде (инъекция зависимостей бедного человека):
public class MyObjectThatUsesSession
{
HttpSessionStateBase _session;
public MyObjectThatUsesSession(HttpSessionStateBase sesssion)
{
_session = session ?? new HttpSessionStateWrapper(HttpContext.Current.Session);
}
public MyObjectThatUsesSession() : this(null)
{}
}
В качестве альтернативы, и, возможно, немного лучше и более гибким будет созданиепроверить шов, обернув взаимодействие с сеансом в другой объект.Затем вы можете изменить это на реализацию базы данных, куки или кеша.Что-то вроде:
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;
}
}
Затем вы можете использовать Moq для создания фиктивной реализации IStateStorage для ваших тестов или для простой реализации на основе словаря.
Надеюсь, это поможет.