Модульное тестирование - объект сеанса? - PullRequest
2 голосов
/ 01 июля 2011

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

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

Ответы [ 2 ]

8 голосов
/ 01 июля 2011

Есть два основных способа сделать это.

Предполагается, что вы используете .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)
    {}
}

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

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 для ваших тестов или для простой реализации на основе словаря.

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

0 голосов
/ 01 июля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...