Vea el libro Working Effectively with Legacy Code de Michael Feathers.
En resumen, es mucho trabajo refactorizar el código existente en código comprobable y probado; A veces es demasiado trabajo ser práctico. Depende de qué tan grande es la base de código, y de cuánto dependen las diversas clases y funciones entre sí.
Refactorear sin pruebas introducirá cambios en el comportamiento (es decir, errores). Y los puristas dirán que en realidad no se está refaccionando debido a la falta de pruebas para verificar que el comportamiento no cambie.
En lugar de agregar pruebas en toda la plataforma a toda su aplicación a la vez, agregue pruebas cuando trabaje en un área de código. Lo más probable es que tenga que regresar a estos "puntos de acceso" nuevamente.
Agregue pruebas de abajo arriba: pruebe las clases pequeñas e independientes y las funciones para la corrección.
Agregue pruebas de arriba hacia abajo: pruebe los subsistemas enteros como cuadros negros para ver si su comportamiento cambia con los cambios en el código. Y entonces puede pasar a través de ellos para descubrir qué está pasando. Este enfoque probablemente te beneficiará más.
Al principio, no se preocupe demasiado sobre cuál es el comportamiento "correcto" mientras agrega pruebas, busque detectar y evitar cambios en el comportamiento. Los sistemas grandes no probados a menudo tienen comportamientos internos que pueden parecer incorrectos, pero de los que dependen otras partes del sistema.
Considere aislar dependencias como base de datos, sistema de archivos, red, para que puedan intercambiarse entre proveedores de datos falsos durante la prueba.
Si el programa no tiene interfaces internas, líneas que definen el límite entre un subsistema/capa y otro, entonces puede que tenga que intentar introducirlas y probarlas.
Además, marcos de burlas automáticas como Rhinomocks o Moq pueden ayudar a simular las clases existentes aquí. Realmente no he encontrado la necesidad de ellos en el código diseñado para la capacidad de prueba.
Creo que su respuesta es mucho mejor con el texto de resumen: podemos obtener más detalles de los enlaces si queremos, pero podemos entender su posición sin leer. –