Извлечение класса, когда TDD'ing. Как проверить новый извлеченный класс? - PullRequest
4 голосов
/ 04 августа 2010

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

У меня вопрос, кроме тех тестов, которые у меня сейчас есть для моего класса SUT (я только начинаю, поэтому у меня в настоящее время есть только один класс, основной из SUT), должен ли я создать для него юнит-тесты? Если так, то как ты это делаешь? Я имею в виду, разрешить ли мне весь мой код, как он есть сейчас, создавать модульные тесты make один за другим, делая тестовый подход первым, пока я не увижу, что в нем есть все функционально, что я хочу, и только там я реорганизую свой код? Я просто создаю класс Matrix и просто проверяю, что старые тесты все еще проходят, и что все в порядке?

Спасибо

Ответы [ 3 ]

8 голосов
/ 04 августа 2010

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

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

7 голосов
/ 04 августа 2010

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

3 голосов
/ 04 августа 2010

Для такого рода рефакторинга компилятор должен направлять вас.Возьмите все, что вы хотите в отдельный класс и скомпилируйте.Он скажет вам, где вам нужно использовать новый класс как в рабочем коде, так и в тестах.Рефакторинг всего до тех пор, пока он не будет скомпилирован и протестирован.

Правильный способ сделать это - перемещать методы / свойства один за другим, это зависит только от того, насколько вам удобно с процессом.

EDIT Вам нужно только создать достаточно тестов, чтобы покрыть ваш код.Ради организации вы должны переместить тесты, которые были в основном классе тестирования, в отдельный класс, но это все.Если процесс рефакторинга требует, чтобы вы написали больше кода (например, метод, который создает экземпляр нового класса), вам также следует написать тесты для этого.

Скажем, вы начинаете с класса и класса теста:

OneBigClass
 -Method1
 -Method2
 -Method3

OneBigClassTest
 -Method1ShouldDoSomething
 -Method2ShouldDoSomething
 -Method3ShouldDoSomething

После рефакторинга вот как должны выглядеть ваши классы:

OneBigClass
 -Method1
 -Method2

SmallerClass
 -Method3

OneBigClassTest
 -Method1ShouldDoSomething
 -Method2ShouldDoSomething

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