Unit testing 在MVC2中模拟会话包装器
我已经看到了如何使用Scott Hanselmans MvcMockHelpers在MVC中伪造SessionState对象,但我正在处理一个单独的问题 我喜欢做的是围绕Session对象创建一个包装器,使对象更容易访问和强类型化,而不是到处使用键。以下是它的基本功能:Unit testing 在MVC2中模拟会话包装器,unit-testing,asp.net-mvc-2,moq,Unit Testing,Asp.net Mvc 2,Moq,我已经看到了如何使用Scott Hanselmans MvcMockHelpers在MVC中伪造SessionState对象,但我正在处理一个单独的问题 我喜欢做的是围绕Session对象创建一个包装器,使对象更容易访问和强类型化,而不是到处使用键。以下是它的基本功能: public class SessionVars { public SessionVars() {} public string CheckoutEmail { get { r
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; }
}
}
公共类SessionVars
{
public SessionVars():此(HttpContext.Current.Session){}
公共会话变量(ICollection会话)
{
会话=(i词典)会话;
}
公开词典会议
{
得到;
私人设置;
}
公共字符串检查邮件
{
获取{返回会话[checkoutEmailKey]作为字符串;}
设置{Session[checkoutEmailKey]=value;}
}
治安
{
获取{返回会话[orderKey]作为顺序;}
设置{Session[orderKey]=value;}
}
}
我错过了一件大事。我觉得这是可能的,我甚至应该离得那么远 我的会话助手实现(供参考):
此外,您可以在单元测试中使用具体的
HttpSessionState
(以下是创建它的方法:),也可以使用HttpSessionStateBase
,但随后必须使用MVC提供的适当对象初始化帮助器(类似于ControllerContext.HttpContext.Session
).您是否尝试使用System.Web.Abstracts中的HttpSessionStateWrapper
它可以简单到:
new HttpSessionStateWrapper(Session)
您可以模拟HttpSessionStateWrapper。您能提供一个示例吗?我可以在测试中模拟会话,我理解这一点。我不明白的是如何设置我的SessionVars类,以便可以注入模拟版本。我不知道这个类的存在,所以现在我更不知道是使用HttpSessionStateBase、IHttpSessionState还是HttpSessionStateWrapper。SessionVars类中会话对象的抽象版本是什么类型的?实际上,我想我明白你的意思了。这就是我所缺少的,事实上,如果不使用您在这里提到的HttpSessionStateWrapper类,我无法从HttpSessionState转到HttpSessionStateBase。使用MVC5和Moq,这些都不适用于我。无法模拟HttpSessionStateWrapper,因为它需要构造函数中的SessionState对象。但是,您可以模拟HttpSessionStateBase,它是HttpSessionStateWrapper的抽象类父级。类似这样:
var sessionStateMock=newmock()代码>sessionStateMock.Setup(x=>x[“key”])。返回(“Value”)代码>