在MVC2中模拟会话包装器

时间:2010-08-13 01:46:18

标签: unit-testing asp.net-mvc-2 moq

我已经看过如何使用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; }
    }
}

我在这里错过了一些大事。我觉得这是可能的,我甚至应该那么遥远。

2 个答案:

答案 0 :(得分:1)

我的会话助手实现(灵感来源):

http://github.com/Necroskillz/NecroNetToolkit/blob/master/Source/NecroNet.Toolkit/SessionData.cs

http://github.com/Necroskillz/NecroNetToolkit/blob/master/Source/NecroNet.Toolkit/ILocalDataProvider.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。