как выполнить юнит-тестирование состояния сеанса - PullRequest
1 голос
/ 18 сентября 2010

Я пытаюсь выяснить, как выполнить модульное тестирование моего объекта, который сохраняется в состоянии сеанса.

Контроллер делает что-то вроде ...

    [HttpPost]
    public ActionResult Update(Account a)
    {
        SessionManager sm = SessionManager.FromSessionState(HttpContext.Current.Session);
        if ( a.equals(sm.Account) )
          sm.Account = a;
        return View("View", a);
    }

И менеджер сеансов сериализует себя в состояние сеанса

public class SessionManager
    {
        public static SessionManager FromSessionState(HttpSessionStateBase state)
        {
            return state["sessionmanager"] as SessionManager ?? new SessionManager();
        }

        public Guid Id { get; set; }
        public Account Account { get; set; }
        public BusinessAssociate BusinessAssociate {get; set; }
    }

Я думаю, что есть два подходак модульному тестированию ...

  1. в статическом инстанциаторе передать ссылку на состояние сеанса и затем восстановить из нее.это позволило бы мне смоделировать этот параметр, и все было бы замечательно.

    public static SessionManager FromSessionState (HttpSessionStateWrapper session) {возврат сеанса ["sessionmanager"] как SessionManager ??новый SessionManager ();}

  2. создать макет для SessionManager и использовать его для тестирования контроллера.

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Вот идея: создать интерфейс "персистентности" диспетчера сеансов:

public interface ISessionManagerPersist
{
    SessionManager Load();
    void Save(SessionManager sessionManager);
}

Создайте реализацию персистентности на основе HTTPSession:

public class SessionStatePersist : ISessionManagerPersist
{
    public SessionManager Load()
    {
        return HttpContext.Current.Session["sessionmanager"] as SessionManager ?? new SessionManager();
    }

    public void Save(SessionManager sessionManager)
    {
        HttpContext.Current.Session["sessionmanager"] = sessionManager;
    }
}

Теперь заставьте ваш контроллер зависеть от ISessionManagerPersist. Вы можете вставить заглушку ISessionManagerPersist во время тестирования и использовать основанную на сеансе заглушку во время производства. Это также имеет то преимущество, что вам не нужно вносить изменения, если вы решили сохранить что-то еще (например, БД или что-то еще). Просто внедрите новый ISessionManagerPersist.

1 голос
/ 18 сентября 2010

В настоящее время это действие контроллера очень сложно для модульного тестирования, так как оно вызывает статический метод, основанный на HttpContext.Current.Хотя первый подход, похоже, работает во втором, вам все равно нужно где-то передать состояние сеанса, чтобы менеджер мог с ним работать.Также не пропускайте HttpSessionStateWrapper, используйте HttpSessionStateBase.

...