Насмешка над оберткой сессии в MVC2 - PullRequest
2 голосов
/ 13 августа 2010

Я видел, как подделать объект 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; }
    }
}

Мне здесь чего-то не хватает. Я чувствую, что это возможно, и что я даже должен быть так далеко.

Ответы [ 2 ]

1 голос
/ 13 августа 2010

Вы пытались использовать HttpSessionStateWrapper из System.Web.Abstractions?

это может быть так просто, как:

new HttpSessionStateWrapper(Session)

Вы можете издеваться над HttpSessionStateWrapper.

1 голос
/ 13 августа 2010

Моя реализация сессионного помощника (для вдохновения):

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).

...