Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 在MVC2中模拟会话包装器_Unit Testing_Asp.net Mvc 2_Moq - Fatal编程技术网

Unit testing 在MVC2中模拟会话包装器

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

我已经看到了如何使用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; }
    }
}
公共类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”)