Если вы еще этого не сделали, возьмите книгу Майкла Фезерса " Эффективная работа с устаревшим кодом ". Это все о том, как добавить тесты в существующий код, а это именно то, что вы ищете.
Но до тех пор, пока вы не закончите читать книгу, я бы предложил начать с регрессионного теста: создать класс, записать его на диск, а затем сравнить этот файл с файлом «заведомо исправного», который вы спрятали в вашем исходном хранилище где-то. Если они не совпадают, провалите тест.
Тогда начните смотреть на интересные решения, которые принимает ваш класс. Посмотрите, как вы можете проверить их. Возможно, вы извлекаете некоторые сложные условия if в публичные функции, которые возвращают bool, и пишете набор тестов, чтобы доказать, что при правильных входных данных эта функция возвращает правильное значение. Возможно, генерация конкретной строки имеет интересную логику; начать тестирование.
По пути вы можете найти объекты, которые хотят выбраться. Например, вы можете обнаружить, что код (или тесты!) Был бы проще, если бы существовал отдельный класс, который генерирует одну строку вывода. Смирись с этим. У вас есть регрессионный тест, чтобы поймать вас, если вы что-то напортачили.
Неуклонно работайте над удалением зависимостей (но убедитесь, что у вас есть высокоуровневый тест, такой как регрессионный тест, чтобы ловить вас, если вы делаете ошибки). Если ваш класс создает свой собственный FileStream и выполняет запись в файловую систему, измените его на взятие TextWriter в своем конструкторе, чтобы вы могли писать тесты, которые передают StringWriter и никогда не касаются файловой системы. Как только это будет сделано, вы можете избавиться от старого теста, который записывает файл на диск (но только если вы не сломали его при попытке записать новый тест!) Если вашему классу требуется соединение с базой данных, проводите рефакторинг, пока не сможете написать тест, который проходит в поддельные данные. И т.д.