Я видел, как подделать объект SessionState в MVC с помощью Scott Hanselmans MvcMockHelpers, но я имею дело с отдельной проблемой.
Что мне нравится делать, так это создавать оболочку вокруг объекта Session, чтобы сделать объекты немного более доступными и строго типизированными, а не использовать ключи повсюду. Вот в основном то, что он делает:
public class SessionVars
{
public SessionVars()
{}
public string CheckoutEmail
{
get { return Session[checkoutEmailKey] as string; }
set { Session[checkoutEmailKey] = value; }
}
}
Так что я могу просто сделать это в моих контроллерах и представлениях:
SessionVars s = new SessionVars();
s.CheckoutEmail = "test@tester.com";
Теперь проблема возникает, когда я хочу написать модульные тесты, этот класс тесно связан с HttpSessionState. То, что я не могу понять, это то, что является правильным классом, чтобы принять / передать так, чтобы я мог передать FakeHttpSession в класс SessionVars. Я пробовал так много вещей с этим, и это (ниже) скомпилируется, но он не может привести HttpSessionState к IDictionary. Я пробовал ICollection, HttpSessionStateBase.
public class SessionVars
{
public SessionVars() : this(HttpContext.Current.Session) { }
public SessionVars(ICollection session)
{
Session = (IDictionary<string, object>)session;
}
public IDictionary<string, object> Session
{
get;
private set;
}
public string CheckoutEmail
{
get { return Session[checkoutEmailKey] as string; }
set { Session[checkoutEmailKey] = value; }
}
public Order Order
{
get { return Session[orderKey] as Order; }
set { Session[orderKey] = value; }
}
}
Мне здесь чего-то не хватает. Я чувствую, что это возможно, и что я даже должен быть так далеко.