2010-06-30 13 views
11

Cuando trabajo con código heredado y trato de crear pruebas, a menudo divido dependencias de clases o métodos para poder escribir pruebas de unidad usando burlas para estas dependencias. Las dependencias más a menudo vienen en forma de llamadas a clases estáticas y objetos creados usando la nueva palabra clave en el constructor u otras ubicaciones en esa clase.La forma más simple y rápida de separar todas las dependencias de una clase

En la mayoría de los casos, las llamadas estáticas se manejan envolviendo la dependencia estática, o si es un patrón singleton (o similar) en forma de StaticClass.Current.MethodCall() pasando esa dependencia por su interfaz va el constructor .

En la mayoría de los casos, los usos de la nueva palabra clave en el constructor simplemente se reemplazan al pasar esa interfaz en el constructor.

En la mayoría de los casos, los usos de la nueva palabra clave en otras partes de la clase se manejan mediante el mismo método que el anterior o, si es necesario, crean una fábrica y pasan la interfaz de fábrica en el constructor.

Siempre utilizo las herramientas de refactorización de Resharpers para ayudarme con todos estos desgloses, sin embargo, la mayoría de las cosas todavía son trabajo manual (que podría automatizarse) y para algunas clases y métodos heredados que pueden ser un proceso muy tedioso. ¿Existen otros complementos de refactorización y/o herramientas que me puedan ayudar en este proceso? ¿Existe una herramienta de refactorización de "romper todas las dependencias de esta clase en un solo clic"? =)

Me parece que todos estos pasos son comunes para muchos desarrolladores y un problema común, y antes de intentar escribir el complemento en Resharper o CodeRush, tengo que preguntar, porque alguien probablemente ya ha intentado esto ...

añadido:

en la reflexión de respuestas a continuación: aunque puede que no desee salir todo a la vez (un clic total de estallido podría causar más problemas que ayuda a) dejar de ser capaz de simplemente salir 1 dependencias de métodos, o 1-2 dependencias fácilmente, serían de gran diferencia.

Además, el código de refactorización tiene una medida de "prueba y ve lo que pasa solo para aprender cómo encaja todo" y un salto total de un clic ayudaría a procesar toneladas, incluso si no verificas ese código en ..

+0

Al igual que el ahora clásico Trabajo eficazmente con el código heredado que se menciona a continuación, puede encontrar el desarrollo de aplicaciones de Brownfield en .NET interesante: http://www.manning.com/baley/ – AakashM

Respuesta

3

No creo que haya ninguna herramienta que pueda automatizar esto para usted. Trabajar con código heredado significa, como usted sabe, cambiar el código con pequeños pasos a la vez. Los pasos son deliberadamente pequeños para evitar errores. Usualmente, el primer cambio que debes hacer es uno que haga que ese código sea comprobable. Después de escribir la prueba, cambia esa parte del código de tal forma que corrige el error o implementa el RFC.

Como debe tomar pequeños pasos, creo que es difícil usar una herramienta de refactorización para hacer desaparecer mágicamente todas sus dependencias. Con los sistemas heredados, casi nunca querrá hacer grandes cambios a la vez, porque el riesgo de romperse (y no descubrirlo debido a la falta de pruebas) es demasiado grande. Sin embargo, esto no significa que las herramientas de refactorización no sean útiles en este escenario. De lo contrario; ellos ayudan mucho

Si aún no lo has hecho, te aconsejo que leas el libro de Michael Feathers Working Effectively with Legacy Code. Describe en gran detalle una serie de patrones que lo ayudan a refactorizar el código heredado a un sistema más comprobable.

Buena suerte.

+0

Estoy a punto de leer ¡este libro! Hay mucha verdad en tu respuesta aquí, ¡así que + por eso! Pero aun así, incluso si no desea dividir todo al mismo tiempo (un clic en una ruptura total podría causar más problemas de los que puede ayudar) aún pudiendo simplemente romper 1 dependencias de métodos, o 1-2 dependencias fácilmente, ser de gran diferencia. Además, el código de refactorización tiene una medida de "prueba y ve lo que sucede solo para aprender cómo encaja todo", y un salto total de un clic ayudaría a procesar toneladas, incluso si no verificas ese código en .. – MatteS

+0

teniendo leer ese libro ahora, todavía encontraría útil una herramienta de este tipo, aunque probablemente no querría verificar el código. Pero simplemente tener una visión general de las dependencias existentes es muy útil. Por método, por clase o cualquier parte de código que necesite cambiar y, por lo tanto, escribir pruebas para. Además, haber leído ese libro también me dio muchas ideas sobre cómo esta herramienta realmente podría ayudar con las formas opcionales de romper realmente las dependencias. – MatteS

+0

@MatteS: Eche un vistazo a NDepend. Le permite visualizar dependencias entre partes del sistema. – Steven

1

Cuando se trata de dependencias de llamadas estáticas, es posible que desee consultar Moles.Es capaz de hacer la inyección de código en tiempo de ejecución para anular cualquier llamada a método estático o no virtual con su propia implementación de prueba. Esto es útil para probar código heredado que no se diseñó utilizando interfaces comprobadas de dependencia inyectada.

Cuestiones relacionadas