2009-07-31 10 views
16

Estoy accediendo a la prueba unitaria de la versión de Visual Studio 2008, y me pregunto cuál es la mejor manera de lograr el class de ensamblaje cruzado para fines de prueba.¿Cómo acceder a las clases en otro ensamblado para fines de pruebas unitarias?

Básicamente, tengo dos proyectos en una sola solución:

  1. MiProyecto (C#)
  2. MyProjectTests (C Proyecto # Prueba)

Todo en MiProyecto tiene actualmente la accesibilidad por defecto, que si recordar correctamente significa que todo es efectivamente internal. Estoy buscando principalmente para probar en el nivel class, pero hay unos pocos delegates involucrados.

Probablemente habrá una API externa en algún momento en el futuro, pero estoy cerca del 20% de la forma completa (al menos en el papel) y me estoy volviendo bastante cauteloso de poner más código en la parte superior de este núcleo no probado. En consecuencia, me gustaría hacer algunas pruebas ahora, antes de que la aplicación esté lo suficientemente completa para las pruebas funcionales tradicionales (leer: malas y/o flojas) y definitivamente antes de que la API n + 1 externa de la versión esté activa.

Además de una respuesta directa, un ejemplo de la solución sería muy apreciada.

+1

Para prevenir su siguiente pregunta - ¿por qué tiene que ser firmado si se firma el ensamble puesto a prueba el conjunto de las pruebas? - aquí está mi artículo sobre ese tema: http://blogs.msdn.com/ericlippert/archive/2009/06/04/alas-smith-and-jones.aspx –

Respuesta

28

Puede usar el atributo de nivel de ensamblaje InternalsVisibleToAttribute para lograrlo.

Añadir

[assembly:InternalsVisibleTo("MyProjectTests")] 

a AssemblyInfo.cs en su ensamblaje MiProyecto.

+0

Con la referencia apropiada de la clave fuerte incluida, por supuesto - Eres fuerte nombrando tus asambleas, no eres tú. –

3

es necesario agregar

[assembly:InternalsVisibleTo("Unit.Tests.Assembly")] 

a AssemblyInfo.cs de su "MiProyecto (C#)". Eso permite que sus pruebas accedan a los métodos internos para las pruebas.

+2

enlace roto arregle – Darcy

1

Parece que necesita el InternalsVisibleToAttribute

Sin embargo, me gustaría recomendar en contra de este enfoque - Pon a prueba tus clases internas a través de la interfaz pública o API.

+0

El problema es que esos no existen todavía; y no lo hará por un tiempo Es una especie de proyecto grande (o lo será cuando esté completo). –

+0

El problema con el enfoque de adentro hacia afuera es que puede encontrarse en una situación en la que tiene las funciones internas hechas ... pero la API externa no se conecta como se esperaba, porque hubo una desconexión en la comprensión. La retroalimentación llega mucho más tarde ... cuando es más caro rectificar. – Gishu

+0

Cierto, pero posponer las pruebas exhaustivas hasta que la aplicación esté "lista" es meramente un problema. Además, la API externa probablemente tomará la forma de automatizar la acción del usuario y extraer datos en lugar de ampliar la funcionalidad; es mucho más difícil de arruinar en comparación con una API de complemento completa. –

3

Puede probar métodos internos, mediante la adición de un atributo a los AssemblyInfo.cs para su proyecto principal, que da acceso a los métodos internos a un ensamblado denominado:

[assembly: InternalsVisibleTo ("MyProjectTestsNameSpace.MyProjectTests ")]

Más información es here

+0

enlace está roto :( – User193452

0

Aunque [InternalsVisibleTo] es la forma más sensata de la OMI, hay al menos 2 maneras de hacer esto:

  • Al usar Reflection

    var method = instance.GetType().GetMethod(
        methodName, BindingFlags.NonPublic | BindingFlags.Instance, 
        null, paramTypeArray, null); 
    return method.Invoke(instance, parameters); 
    

El problema con este enfoque es que si el nombre o la firma del método cambia, la prueba de la unidad comenzará a fallar en el tiempo de ejecución, mientras que [InternalsVisibleTo] se habría recogido fácilmente este cambio en tiempo de compilación.

Cuestiones relacionadas