我已经看过如何使用Scott Hanselmans MvcMockHelpers伪造MVC中的SessionState对象,但我正在处理一个单独的问题。
我喜欢做的是创建一个围绕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; }
}
}
我在这里错过了一些大事。我觉得这是可能的,我甚至应该那么遥远。
答案 0 :(得分:1)
我的会话助手实现(灵感来源):
http://github.com/Necroskillz/NecroNetToolkit/blob/master/Source/NecroNet.Toolkit/SessionData.cs
另外,你可以在单元测试中使用具体的HttpSessionState
(这里是如何创建它:http://www.necronet.org/archive/2010/07/28/unit-testing-code-that-uses-httpcontext-current-session.aspx),或者你可以使用HttpSessionStateBase
,但是你必须初始化你的助手用MVC提供的适当对象(类似ControllerContext.HttpContext.Session
)。
答案 1 :(得分:1)
您是否尝试过使用System.Web.Abstractions中的HttpSessionStateWrapper?
它可以像以下一样简单:
new HttpSessionStateWrapper(Session)
你可以模拟HttpSessionStateWrapper。