Pregunta

Me estoy lanzando a las pruebas unitarias de la manera Visual-Studio 2008, y me pregunto cuál es la mejor manera de lograr el acceso de class entre ensamblados con fines de prueba.

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

  1. MyProject (C #)
  2. MyProjectTests (Proyecto de prueba de C #)

Todo en MyProject actualmente tiene accesibilidad predeterminada, lo que si recuerdo correctamente significa que todo es efectivamente interno . Estoy buscando principalmente realizar pruebas en el nivel class , pero hay algunos delegados involucrados.

Probablemente habrá una API externa en algún momento en el futuro, pero estoy cerca del 20% de la función completa (al menos en papel) y estoy bastante receloso de superponer más código encima de esto sin probar núcleo. En consecuencia, me gustaría realizar algunas pruebas ahora, antes de que la aplicación esté lo suficientemente completa para las pruebas funcionales tradicionales (léase: malas y / o flojas) y definitivamente antes de que la API externa de la versión n + 1 esté activa.

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

¿Fue útil?

Solución

Puede usar el atributo de nivel de ensamblado InternalsVisibleToAttribute para lograr esto.

Añadir

[assembly:InternalsVisibleTo("MyProjectTests")]

a AssemblyInfo.cs en su ensamblado MyProject.

Otros consejos

Puede probar métodos internos, agregando un atributo a AssemblyInfo.cs para su proyecto principal, dando acceso a los métodos internos a un ensamblado con nombre:

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

Más información es aquí

Necesita agregar

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

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

Parece que necesita el InternalsVisibleToAttribute

Sin embargo, recomendaría este enfoque: pruebe sus clases internas a través de la interfaz pública o API.

Aunque [InternalsVisibleTo] es la forma más sensata de IMO, hay al menos otras 2 formas de hacerlo:

  • 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 del método o la firma cambian, la prueba unitaria comenzará a fallar en el tiempo de ejecución, mientras que [InternalsVisibleTo] se habría recogido fácilmente este cambio en la compilación tiempo.

Encontré este https://msdn.microsoft.com/en -us / library / hh598957.aspx Espero que pueda ayudar a alguien.

Resumen:

  • En su proyecto de prueba de unidad, agregue una referencia al código bajo prueba. Aquí le mostramos cómo crear la referencia a un proyecto de código en la misma solución:
  • Seleccione el proyecto en el Explorador de soluciones.
  • En el menú Proyecto, elija Agregar referencia ....
  • En el cuadro de diálogo Administrador de referencia, abra el nodo Solución y elija Proyectos.
  • Verifique el nombre del proyecto de código y cierre el cuadro de diálogo.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top