2009-03-03 43 views

Respuesta

15

Escriba pruebas que especifiquen el comportamiento de la interfaz externa de la clase de nivel superior. Si esa clase usa clases internas para implementar ese comportamiento o no, es un detalle de implementación de la clase, y las pruebas no necesitan saber nada al respecto.

Si la clase interna no puede ser probada adecuadamente a través de la interfaz de la clase de nivel superior, entonces generalmente es mejor mover la clase interna y probarla directamente como una nueva clase de nivel superior. Querer probar las clases internas es un olor a código que la clase interna podría ser lo suficientemente significativa como para ser una clase de nivel superior.

1

Al usar MS Visual Studio para pruebas unitarias, simplemente debe crear un private Accessor. Internamente, funciona con reflexiones, creo. Solo eche un vistazo al código generado.

2

No lo prueba directamente. Será probado a través de la clase donde está definido.

Y, si aplica TDD, como actualmente lo implican estas etiquetas de pregunta, ¿cuál es la prueba que acaba de escribir esa llamada para una clase interna? Quiero decir, ¿no puede ser una clase estándar, de propiedad privada de la clase en la que estás trabajando?

1

Hemos utilizado una clase auxiliar que utiliza la reflexión para cargar y llamar a métodos en clases internas. También es posible cambiar la accesibilidad en tiempo de compilación usando el símbolo de depuración por ejemplo

#if DEBUG 
public 
#else 
internal 
#endif 
    class MyInternalClass 
{ 
    ... 
} 

Sin embargo la respuesta de Esko Luontola es más correcto, ya que es los requisitos de funcionalidad o de negocios que son más importantes. Es fácil centrarse demasiado en la cobertura del código en lugar de probar las áreas de riesgo importantes.

5

No es que lo recomiende, pero también puede usar el InternalsVisibleToAttribute.

+0

usted dice que no recomendaría este, pero la forma en que habría que resolver algo como esto? http://stackoverflow.com/questions/15440935/how-to-test-internal-class-library –

+0

@Thomas: exactamente como dice Esko en su respuesta. O prueba las API internas indirectamente a través de su interfaz pública, o promociona sus API internas a público y las prueba directamente. –