Ответ 1
В основном это два способа сделать это.
Предполагая, что вы используете .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)
{}
}
В качестве альтернативы и, возможно, немного лучше и более гибкий дизайн будет заключаться в создании тестового шва путем переноса вашего взаимодействия с сеансом в другом объекте. Затем вы можете впоследствии изменить это на версию базы данных, cookie или на основе кеша. Что-то вроде:
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 для своих тестов или создания простой версии на основе словаря.
Надеюсь, что это поможет.