Модульное тестирование класса с вызовом статического класса, обертывающего HttpContext - PullRequest
1 голос
/ 25 ноября 2010

У меня есть метод, для которого я добавил модульные тесты в веб-проекте C # / ASP.Net.Этот метод был изменен кем-то другим, чтобы включить вызов статического метода в класс, который оборачивает HttpContext (для добавления некоторого состояния сеанса), но во время тестирования у меня нет HttpContext, поэтому это вызывает исключение нулевой ссылки.Есть идеи как обойти эту проблему?Я не хочу вносить слишком много изменений в производственный код, если смогу помочь.

Тестируемый метод:

public int MethodUnderTest() 
{
    ...
    // Added line which breaks the tests
    StaticClass.ClearSessionState();
}

В StaticClass:

public void ClearSessionState()
{
    HttpContext.Current.Session["VariableName"] = null;
}

Это выдает NullReferenceException, потому что HttpContext.Current является нулевым во время тестирования.

Ответы [ 4 ]

1 голос
/ 25 ноября 2010

Вы можете установить HttpContext.Current с помощью объекта-заглушки перед вызовом строки StaticClass.ClearSessionState().

1 голос
/ 25 ноября 2010

Вы можете сделать свою собственную статическую «инъекцию» в производственный код следующим образом:

public static class StaticClass {
    public void ClearSession() {
        TheContext["VariableName"] = null;
    }

    public static HttpContextBase TheContext{
        get { 
            if (_context == null)
                _context = new HttpContextWrapper(HttpContext.Current);
            return _context; }
        set { _context = value; }
    }
}

Фактический тест становится довольно тривиальным, просто установите свойство TheContext для экземпляра заглушки перед тестом.Например, в Moq такую ​​заглушку можно настроить одной строкой:

StaticClass.TheContext = new Mock<HttpContextBase>(){DefaultValue = DefaultValue.Mock}.Object;
1 голос
/ 25 ноября 2010

Вы находитесь в тупике, когда речь идет о методах модульного тестирования, использующих HttpContext.Current.Правильным способом было бы изменить этот код, чтобы использовать инжектор конструктора:

private readonly HttpContextBase _context;
public Foo(HttpContextBase context)
{
    _context = context;
}

public void ClearSessionState()
{
    _context.Session["VariableName"] = null;
}

Теперь вы можете смоделировать это HttpContextBase в своем модульном тесте.

0 голосов
/ 25 ноября 2010

В конце концов, я могу просто удалить звонок на StaticClass.ClearSessionState(), но спасибо за все ответы Полезные вещи.

...