Pregunta

Tengo clases que anteriormente tenían métodos masivos así que subdividen el trabajo de este método sobre los métodos de ayuda ''.

Estos métodos auxiliares se declaran private para hacer cumplir la encapsulación - sin embargo yo quiero prueba unitaria de los grandes métodos públicos. ¿Es bueno para la unidad a prueba los métodos de ayuda demasiado, como si uno de ellos falla el método pública, que requiere también fallará, y de esta manera podemos identificar por qué ha fallado?

También con el fin de probar estas usando un objeto de burla que tendría que cambiar su visibilidad de lo privado a proteger, es aconsejable?

¿Fue útil?

Solución

Una forma es omitir private y poner las pruebas en el mismo paquete. A continuación, las pruebas pueden llamar a los métodos internos pero nadie más (= fuera del paquete) pueden.

Además, a falta de métodos internos debe producir mensajes de error que hacen que sea fácil de solucionar el problema. Cuando se pone el código en la producción, verá menos de las pruebas y estará bajo mucha presión para solucionar los problemas rápidamente. Así que un minuto que pase aquí le ahorrará una hora más tarde con su jefe sentado en su cuello.

Otros consejos

Esto huele como usted tiene el problema equivocado. Lo que he descrito es similar a la creación de un sub- "prueba de unidad", lo que me lleva a creer que las pruebas unitarias son realmente probando una unidad después de todo.

Lo que no es una crítica de lo que está tratando de hacer: pasar de "donde estamos hoy" a "en algún lugar más que es notablemente mejor" es una jugada ganadora. Sin embargo, se trata de una sugerencia de que das un paso atrás un poco para evaluar dónde se encuentra -. Comprensión de cómo su situación actual difiere de un ideal platónico podría ayudar a mostrar nuevas posibilidades

Hay un montón de sugerencias aquí sobre la determinación del alcance de sus métodos de ayuda. Otra posibilidad sería la de examinar la aplicación para determinar si hay clases de ayuda que están al acecho en su aplicación actual. La creación de una nueva clase y un conjunto de pruebas para ejercer siempre es aceptable.

Tenga en cuenta que este enfoque se aísla de la refactorización: se puede cambiar la aplicación sin cambiar su conjunto de pruebas (debido a que las pruebas unitarias para el objeto de ayuda siguen pasando incluso cuando el objeto ayudante ya no forma parte de la implementación de la producción), y se obtiene un envase limpio de la implementación y las pruebas por él (caso de uso:. decide que bozo-tipo es la aplicación incorrecta, y ya no debe usarse si se aísla la implementación bozo-tipo, a continuación, sólo tiene que quitar y sus pruebas. Pero cuando las pruebas de la aplicación bozo-tipo se enredaron con todas las otras pruebas, hay más pensamiento involucrado).

También puede ayudar a revisar por qué usted tiene pruebas unitarias para su código. Si una de las razones es "para hacer refactorización seguro", entonces usted no quiere ser escribir las pruebas que se traban en una implementación.

Si su clase es realmente tan grande, entonces suena como usted debe romper ayudante objetos , no sólo helper métodos (aunque la extracción de los métodos es a menudo un paso a lo largo la manera). Una vez que hayas hecho esto, su antigua clase se hace más simple y más fácil de probar (tal vez con burla, tal vez no), y se puede probar los métodos en las nuevas clases de apoyo directo.

Mi preferencia es poner a prueba a través de la API pública de un objeto. Si eso es demasiado duro, entonces es un indicio de que el objeto debe ser dividido.

Estoy bastante sorprendido por algunas de las respuestas aquí.

En esencia algunas personas están diciendo "No pruebe el código privado, debido a que viola el paradigma TDD"

Pruebe el código de comino. Haz lo que necesita con el fin de asegurarse de que funciona exactamente como debe ser.

En lo personal, me gustaría hacer los métodos protegidos o por defecto, escribir las pruebas, ejecutar las pruebas, y en caso de éxito, volver a privado. En este punto, me gustaría comentar a cabo las pruebas pertinentes, y dejar un bloque de instrucciones por encima de ellos:

/ ** Lo siento por esto, pero he heredado un desastre ... * Si usted necesita probar estos métodos, exponerlos en la fuente y no-comentar las siguientes líneas * * /

Sin embargo, absolutamente nunca dejó rígida adhesión a una metodología de desarrollo en el camino de la mejora de código.

Si desea probar ayudante métodos que puede cambiarlos de privado, pero que podría considerar esto.

No se debe poner a prueba la unidad de detalles privados de su aplicación sobre todo porque podría variar debido a la refactorización y "romper" su prueba.

Este es uno de esos casos en los que diría que adelante y romper las reglas.

Si estuviera diseñando la clase a partir de cero, que definitivamente no quieren métodos de ayuda para ser unidad probada por su propia cuenta, pero ... ya que se reestructuran una clase existente, es aceptable para romper las reglas con el fin de hacer Asegúrese de no romper nada.

Haciéndolos protegidos le permitirá probar los ayudantes sí mismos, para asegurarse de que todavía tienen el comportamiento que esperan a medida que tira la lógica del método de bola de pelo grande, así como le permiten dejamos vacías y devolver respuestas fijas para que pueda asegurarse de que el gran método que se reestructuran se comporta como se esperaba para ciertos resultados de los métodos de ayuda.

Pero no hemos terminado todavía en ese punto. Dividiendo el método de arriba no es realmente llegar a la raíz de su problema. Ahora que ha el método roto y un conjunto de (un poco ortodoxo) Los exámenes que muestran exactamente lo que toda la lógica cambia, está en una buena posición para volver a examinar toda la clase y tratar de averiguar por qué el método era tan grande en el primer lugar. Lo más probable es toda la clase también tiene que ser dividido en unidades más pequeñas con responsabilidades diferenciadas que serán más fáciles de probar, sin doblar las reglas.

Es, básicamente, tiene 2 opciones:

  1. Aumentar el alcance de los métodos de ayuda del sector privado al defecto. A continuación, puede probar estos métodos (suponiendo que las clases de prueba se encuentran en el mismo paquete que el sujeto de prueba). Esto mejora la capacidad de prueba de la clase, pero se sacrifica parte de encapsulación

  2. Deja todo como está. Esto le impedirá escribir pruebas de grano muy fino, pero no le requiere a sacrificar cualquier encapsulación.

En lo personal, yo elegiría (2), porque usted no debe realmente necesita para poner a prueba los métodos privados. La clase debe ser probado a través de su interfaz pública (que a su vez llamar a los métodos privados. Métodos privados de análisis puede resultar en pruebas frágiles, es decir, las pruebas que fallan cuando solamente el comportamiento interno de unos cambios de clase.

Hay una tercera opción (que yo soy reacio a hablar): utilizar la reflexión (o algún otro vudú) para invocar métodos privados dentro de su clase de prueba. Esto tiene las desventajas de (1) y también las desventajas intrínsecas a código reflectante (por ejemplo bypasses comprobación de tipos y es difícil de leer)

Como dicen Don y Dror, por lo que los métodos pública para que pueda crear pruebas unitarias para los rompe la encapsulación. A continuación, amarras a una aplicación particular. Por hacerlas públicas, se declara al mundo que estos métodos son parte de la interfaz publicada y por lo tanto sus especificaciones están bloqueados.

En lo personal, me gustaría ir para una solución más pragmática: mantenerlos privados y no escribir pruebas unitarias. Si se llega a un caso en que falla un método público y no se puede averiguar por qué, pero se piensa que podría ser un problema en uno de sus métodos privados, a continuación, hacer temporalmente pública, escribir la unidad de prueba, depuración, y cuando termine, que sean privadas de nuevo y comentar la unidad de prueba.

unidad de prueba los métodos de ayuda al escribir pruebas unitarias que ejercen aquellas partes de su código.

Ha definido una API pública en esta clase por una razón, ¿verdad? Prueba de eso. Si funciona, la clase funciona.

herramientas de cobertura de uso de código para ayudarle a saber si una porción suficiente de esa clase está siendo probado, y si no lo es, escribe más pruebas de unidad para el ejercicio de la API pública y golpear las esquinas que no están siendo cubiertos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top