Тестирование устройства - объект сеанса?

Недавно я реализовал единицу шаблона работы, а в качестве среды мы используем больше модульного тестирования. В настоящее время реализация записывает в помощник сеанса, который записывает на сеанс. Как я unit test эти аспекты в отношении сеанса? Должен ли я создать шаблон хранилища? (интерфейс репозитория с конкретной реализацией сеанса и реализацией конкретного макета) Как это обычно делается?

Я знаю, что, возможно, есть несколько способов приблизиться к этому, но я просто ищу советы.

Ответ 1

В основном это два способа сделать это.

Предполагая, что вы используете .NET 3.5 или выше. Измените свою реализацию, чтобы взять объект HttpSessionStateBase в качестве параметра конструктора, затем вы можете издеваться над этой реализацией - вот несколько учебников онлайн о том, как это сделать. Затем вы можете использовать контейнер IoC, чтобы подключить его к началу приложения или сделать что-то вроде (инъекция зависимости бедных):

public class MyObjectThatUsesSession
{
    HttpSessionStateBase _session;

    public MyObjectThatUsesSession(HttpSessionStateBase sesssion)
    {
         _session = session ?? new HttpSessionStateWrapper(HttpContext.Current.Session);
    }

    public MyObjectThatUsesSession() : this(null)
    {}
}

В качестве альтернативы и, возможно, немного лучше и более гибкий дизайн будет заключаться в создании тестового шва путем переноса вашего взаимодействия с сеансом в другом объекте. Затем вы можете впоследствии изменить это на версию базы данных, cookie или на основе кеша. Что-то вроде:

public class MyObjectThatUsesSession
{
    IStateStorage _storage;

    public MyObjectThatUsesSession(IStateStorage storage)
    {
         _storage= storage ?? new SessionStorage();
    }

    public MyObjectThatUsesSession() : this(null)
    {}

    public void DoSomethingWithSession()
    {
        var something = _storage.Get("MySessionKey");
        Console.WriteLine("Got " + something);
    }
}

public interface IStateStorage
{
    string Get(string key);
    void Set(string key, string data);
}

public class SessionStorage : IStateStorage
{
    //TODO: refactor to inject HttpSessionStateBase rather than using HttpContext.

    public string Get(string key)
    {
       return HttpContext.Current.Session[key];
    }

    public string Set(string key, string data)
    {
       HttpContext.Current.Session[key] = data;
    }
}

Затем вы можете использовать Moq для создания макетной реализации IStateStorage для своих тестов или создания простой версии на основе словаря.

Надеюсь, что это поможет.

Ответ 2

Несколько неопределенный вопрос, но я все же пытаюсь дать вам некоторые идеи. Вероятно, вы сможете немного уточнить свой вопрос.

Вы можете заменить помощника сеанса макетом, шпионом или поддельным объектом. Таким образом, после окончания единицы работы вы можете проверить, что все необходимые данные достигли сеансового помощника. На мой взгляд, поддельный объект предпочтительнее, но я не знаю достаточно подробностей о вашем случае. Как доставить эту фальшивку на сеанс зависит от вашего дизайна. Например, помощник сеанса может быть передан в единицу работы при его строительстве. Или вы можете использовать репозиторий, как вы написали, но тогда вы должны внедрить репозиторий в единицу работы и, возможно, создать дополнительный поддельный репозиторий, чтобы возвращать поддельные помощники сеанса. Существуют и другие решения.

Обратите внимание, что детали взаимодействия между помощником сеанса и самим сеансом также должны быть отдельно проверены модулем. Но если ваш помощник сеанса - очень простой объект, вы можете проверить, правильно ли они достигли сеанса. Таким образом, ваш помощник сеанса будет проверен косвенно, и вам не нужно беспокоиться о создании отдельного теста.