Тестирование недружественного кода - PullRequest
0 голосов
/ 28 мая 2011

Скажите, что у меня есть следующий код, который нельзя изменить:

class A {
    public doSomething() {
        // lots of business logic
        data = obtainData();
        // lots of other business logic which depends on data
    }

    private obtainData() {
        // connect to the database
        // send web requests
        // send manned missions to the moon
        // process the obtained data
        return data;
    }
}

Каковы лучшие практики тестирования такого кода?Я хочу убедиться, что doSomething() делает то, что должен, но я хочу предоставить ему известные данные вместо запуска кода внутри obtainData().

Ответы [ 4 ]

0 голосов
/ 31 мая 2011

Работа над дизайном

  1. Определите обязанности этого класса.
  2. Далее, Извлеките зависимости этого класса. Переместите все методы, которые не совпадают с маркером # 1, в зависимость.

например. если этот класс не отвечает за обработку баз данных или сетевой ввод-вывод, извлеките их как зависимости этого класса. Вставьте их как аргументы ctor или аргументы метода (если это требуется только для одного публичного метода).

public A(DataRepository repository, WebService service, SpaceStation spaceStation)
{ // cache them as internal fields;}

Теперь нет необходимости заглушать или создавать подклассы и переопределять или увеличивать видимость элемента для тестирования.

Ваши юнит-тесты создадут экземпляр как

_testSubject = new A(new Mock<DataRepository>.object, new Mock<WebService>.object, new Mock<SpaceStation>.object);

тогда как ваш производственный код будет использовать реальные реализации указанных выше ролей.

0 голосов
/ 28 мая 2011

Взгляните на Родинок , чтобы помочь вам в тестировании на коричневом поле.Кроты в C # позволяют вам предоставлять свои собственные реализации для частного кода и кода других людей.

Если у вас есть хороший набор тестов, которые охватывают этот беспорядок, пожалуйста, re-factor , чтобы спасти человечество.

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

Для получения наилучшей практики прочитайте Чистый код дяди Боба http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

Подводя итог: если тестируемый код имеет внешние зависимости, сделайте их явными и настраиваемыми извне.

0 голосов
/ 28 мая 2011

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

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

Также подумайте о том, чтобы иметь более мелкие классы, которые выполняют очень специфические задачи, есть вероятность, что если вы опишите вашу классовую задачу с помощью «и» в предложении, она сделает слишком много и ее будет сложнее проверить.

См. этот пост и все связанные с ним ссылки для получения информации о тестировании статических и жестко закодированных зависимостей.

0 голосов
/ 28 мая 2011

Вы смотрели на издевательство?Это может быть предоставлено вашей структурой модульного тестирования.

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