Я думаю, у Томаша Зелинского есть часть ответа. Но если вы говорите, что у вас есть 3500 строк процедурных кодов, то проблема больше, чем это.
Разрезание на несколько функций не поможет вам проверить это. Тем не менее, это первый шаг для определения обязанностей, которые могут быть переданы другому классу (если у вас есть хорошие имена для методов, это может быть очевидно в некоторых случаях).
Я полагаю, что с таким классом у вас есть невероятный список зависимостей, с которыми можно справиться, просто чтобы можно было реализовать этот класс в тесте. Тогда становится действительно трудно создать экземпляр этого класса в тесте ...
Книга Майкла Фезерса «Работа с устаревшим кодом» очень хорошо отвечает на такие вопросы.
Первая цель, чтобы иметь возможность хорошо протестировать этот код, должна состоять в том, чтобы определить роли класса и разбить его на более мелкие классы. Конечно, это легко сказать, и ирония заключается в том, что без тестов безопасно защищать ваши модификации ...
Вы говорите, что у вас есть только один публичный метод в этом классе. Это должно облегчить рефакторинг, так как вам не нужно беспокоиться о пользователях, все частные методы. Инкапсуляция - это хорошо, но если у вас есть столько вещей в этом классе, это, вероятно, означает, что они не принадлежат этому классу, и вы должны извлечь из этого монстра разные классы, которые вы в конечном итоге сможете протестировать. Шаг за шагом, дизайн должен выглядеть чище, и вы сможете протестировать больше этого большого куска кода.
Ваш лучший друг, если вы начнете, это будет инструмент рефакторинга, тогда он должен помочь вам не нарушать логику при извлечении классов и методов.
Снова книга от Майкла Фезерса, кажется, должна быть прочитана для вас :)
http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052
ДОБАВЛЕННЫЙ ПРИМЕР:
Этот пример взят из книги Майкла Фезерса и хорошо иллюстрирует вашу проблему, я думаю:
RuleParser
public evaluate(string)
private brachingExpression
private causalExpression
private variableExpression
private valueExpression
private nextTerm()
private hasMoreTerms()
public addVariables()
здесь, конечно, нет смысла делать методы nextTerm и hasMoreTerms общедоступными. Никто не должен видеть эти методы, то, как мы переходим к следующему пункту, определенно является внутренним для класса. так как проверить эту логику ??
Хорошо, если вы видите, что это отдельная ответственность и извлекаете класс, например, Tokenizer. этот метод внезапно станет общедоступным в этом новом классе! потому что это его цель. Тогда становится легко проверить это поведение ...
Так что, если вы примените это к своему огромному куску кода и извлечете его в другие классы с меньшими обязанностями, и где было бы более естественным сделать эти методы общедоступными, вы также сможете легко их протестировать. ,
Вы сказали, что получаете доступ к 40 различным таблицам, чтобы отобразить их. Почему бы не разбить это на классы для каждой части отображения?
Довольно сложно рассуждать о коде, который я не могу прочитать. Возможно, у вас есть другие проблемы, которые мешают вам сделать это, но это моя лучшая попытка.
Надеюсь, это поможет
Удачи:)