2010-01-20 13 views
7

Soy bastante nuevo en TDD pero lo he usado durante el tiempo suficiente para entender cómo usar mocks, stubs, inyección de dependencia, inversión de control para resolver problemas 'similares' ... pero por alguna razón me siento muy incómodo al usar inyección de dependencia y paso en un 'IThread' (o similar).¿Cómo se prueba un método que genera hilos?

Para darle un contexto básico, estoy tratando de agregar pruebas de unidad a una aplicación heredada y no estoy seguro de cómo probar una unidad cuyo constructor genere dos hilos.

¿La única opción es usar inyección de dependencia?

Si es así, ¿qué pasa con la funcionalidad que aportan los hilos? Tal como está, los subprocesos se ejecutan en bucles (verdaderos) y nunca salen del bucle (a menos que la aplicación termine). Dentro de los bucles hay fragmentos razonables de código y este es el código que realmente quiero tener bajo prueba.

Para empeorar las cosas, no quiero sacar toda la funcionalidad de los bucles y entrar en public métodos (solo estoy probando métodos públicos ya que mis pruebas existen en otro proyecto) ya que realmente disminuirá el fácil de usar de la clase en otro lugar en el código.

¿Alguna sugerencia?

Respuesta

5

¿Podría utilizar la funcionalidad en métodos internos y usar InternalsVisibleTo en su lugar? Incluso si realmente desea que sean privados, esta es una solución de compromiso razonable.

Si sus hilos normalmente se ejecutarían para siempre, eso hace que sea muy difícil de probar ... y parece que realmente debería probar la parte "lo que hacen los hilos" por separado, si no lo hacen depende en estar en hilos separados.

Una opción que de vez en cuando es útil es tener un tipo de interfaz IScheduler; solicítelo para ejecutar una acción donde lo considere oportuno; el de producción crearía un nuevo hilo, pero su prueba uno podría ejecutar la acción dentro del hilo existente (o en un hilo que tenía control dentro de su código de prueba). No estoy seguro de que sea apropiado para su situación aquí, donde el hilo se ejecutará para siempre, pero es posible que desee pensar en ello en otras situaciones.

+0

Sí, es un compromiso razonable ya que la clase que estoy probando está en una biblioteca de clase y solo se usa externamente. Esto funcionará muy bien, ¡gracias! – InvertedAcceleration

Cuestiones relacionadas