Модульное тестирование устаревшего кода C # - PullRequest
3 голосов
/ 19 января 2011

Как написать тест NUnit для такого метода.Этот метод сам по себе требует рефакторинга?Каков наилучший подход для решения подобных сценариев в коде устаревания?

         public bool DoXYZ()
            {
                ABC abc= new ABC()
                XYZ xyz = new XYZ();
                if (xyz .IsSomeCondition(Session.SessionID))
                { return false; }
                else
                { return abc.IsSomeOtherCondition(SessionID.SessionID); }
            }

Ответы [ 4 ]

3 голосов
/ 19 января 2011

Вам, вероятно, потребуется реорганизовать его, чтобы ввести хуки для внедрения зависимостей.Например, класс, содержащий метод DoXYZ, может получить новые свойства для ABC и XYZ.Эти свойства могут по умолчанию использовать экземпляры ABC и XYZ, но в модульных тестах их можно заменить на фиктивные версии.

И если вы предпочитаете использовать IoC, этот подход также поддерживает это

1 голос
/ 19 января 2011

У вас есть два варианта:

  • Рефакторинг вашего кода и использование внедрения зависимостей, как предложили Джоэл и Крис. Это может потребовать много работы, но сделает ваш код чистым и легко тестируемым.
  • Используйте расширенный каркас для моделирования неинъецированных зависимостей, как задано в этом вопросе .

Вероятно, в большом устаревшем коде используются оба подхода.

Вы также можете проверить эту статью из журнала MSDN.

1 голос
/ 19 января 2011

Я бы определенно реорганизовал рефакторинг для внедрения идентификатора сеанса через параметр - в противном случае вам придется создавать сеанс вручную.

Можно ли сделать статичным? Похоже, особенно если вы вводите sessionid.

Кроме того, вы реализуете (короткий) диспетчер команд, который обычно считается антишаблоном по сравнению с IoC (см. Ответ Джоэла Мартинеса выше).

0 голосов
/ 20 января 2011

Учитывая запутанный код в вопросе, я могу предложить только несколько указателей

  • Я вижу 2 пути - поэтому минимум 2 модульных теста нужны.
  • создание коллабораторов в методе обычно проблематично в будущем. Передайте зависимости как параметры ctor / метода. Это позволяет вам получить фальшивку и манипулировать ветвлением (например, заставить xyz.IsSomeCondition вернуть false для этого теста). Если ABC и XYZ являются простыми классами, которые легко настроить, то это может не быть немедленной проблемой ... вы могли бы сейчас жить без рефакторинга Extract Parameter.
  • извлекает sessionId в параметр для исключения доступа к статическим (глобальным) переменным, которые обычно сохраняют свои предыдущие значения, вызывая зависимости между тестами

.

public bool DoXYZ(ABC abc, XYZ xyz, Guid sessionId) 
{    if (xyz.IsSomeCondition(sessionId))    
        return false; 

     return abc.IsSomeOtherCondition(sessionId);  
}
...