2008-08-27 22 views
13

De acuerdo.ASP.NET - ¿Cómo comprueba Unit Test WebControls?

Así que creo que ya es hora de que entre en pruebas unitarias, ya que todo el mundo ha estado hablando de ello por un tiempo suficiente. Instalé NUnit y realicé algunos tutoriales del tipo "Introducción a la prueba de unidades".

Actualmente estoy armando un pequeño marco para ayudar con la reconstrucción de una de nuestras aplicaciones web, así que he creado un proyecto VS2008 para mi framework y quiero probarlo a medida que avanzo.

¿Cómo hago para probar las unidades de WebControls? Todos los métodos están protegidos o son privados, y dado que es un marco, no hay mucho más que WebControls.

¿Alguna sugerencia?

Burns

Respuesta

8

Puede hacer arquitecturas de modelo-vista-controlador o modelo-vista-presentador sin utilizar un marco completo. Ya descubrió que los componentes de la interfaz de usuario de la unidad son difíciles. Hay formas de evitarlo, pero probablemente no quieras seguir esa ruta. Por lo general, esto hará que sus pruebas sean muy difíciles de mantener, más pesadilla de mantenimiento es algo que los programadores pueden hacer sin :-)

Intente separar la funcionalidad que desea probar en una clase de "controlador" o "presentador". Luego prueba esa clase. Para que sea más comprobable, puede ocultar la clase de control de usuario (la vista) detrás de una interfaz y hacer que el controlador o el presentador hablen a la vista a través de la interfaz. De esa forma, puedes simular la vista en tus pruebas.

Sé que esto suena como un montón de trabajo y parece una solución, pero si te acostumbras a esto, es una arquitectura realmente agradable que hace que sea mucho más fácil cambiar el comportamiento de la interfaz de usuario. Siempre se puede comenzar a utilizar un framework mvc "real" cuando realmente lo necesite :-)

5

Ues el atributo assembly:InternalsVisibleTo y podrás acceder a los miembros privados.

lo puso en AssemblyInfo.cs de su proyecto de webcontrol (bajo Propiedades de nodos)

[assembly:InternalsVisibleTo("YourTestProjectName")] 
3

que haya encontrado el mayor punto de ASP.NET dolor. En cuanto a clases privadas selladas que dificultan las pruebas unitarias.

Esta es la razón principal por la que las personas TDD usarán una estructura MVC (ASP.NET MVC, Castle MonoRail) ya que proporciona una separación clara de las plantillas de vista y la lógica de su controlador. Los controladores son totalmente comprobables.

0

El framework MVC mencionado anteriormente es la mejor manera de probar lo que hace el control. Sin embargo, probar cómo funciona es un poco diferente.

Esto está totalmente fuera de lugar pero podría hacer que el control de usuario exponga algunos métodos y propiedades protegidos para devolver información de validación y luego tener un control de usuario de prueba heredado. Ese control podría poblar campos, presionar botones y lo que no. Algo desordenado, pero podría funcionar.

0

También puede consultar este marco Rhino Igloo. Es un marco de MVC comprometido para WebForms.

1

This es un artículo antiguo por ahora, pero estaba usando NUnitASP para escribir pruebas de nunit para asp.net WebControls en 2004.Ese artículo da un ejemplo detallado de probar un control simple usando su concepto de crear una clase correspondiente "Tester" que encapsula los detalles de su control de sus pruebas. El comprobador también puede (debería) estar en el mismo ensamblaje que su control, por lo que puede compartir algunas cosas entre ellos (por ejemplo, funciones de utilidad, constantes, etc.).

Utilicé la técnica (y otras usan variantes de la técnica) todavía hoy para probar controles muy sofisticados.

Espero que sea útil.

+1

a Scott, este enlace se rompe ahora :( – Jono

+2

@ JonoRR Gracias a Dios por archive.org: http://web.archive.org/web/20080705112750/http://blogs.pingpoet.com/overflow/archive/2004/03/18/474.aspx BTW: Tengo un hacer una copia de seguridad de ese sitio y agregar una tarea a mi lista de tareas pendientes para que se la devuelva pag. Dirijo URLs muertas (aunque, francamente, es una tarea de baja prioridad). –

0

Ivonna puede probar WebControls de forma aislada, en el contexto Asp.Net Sólo tiene que llamar session.GetControl ("Path.ascx") y compruebe que tiene todas las propiedades necesarias.

1

También podría consultar los componentes de prueba a través del navegador como un usuario los vería usando un marco de prueba como WebAii. Lo he visto funcionar y es genial. También me han dicho que puedes conectarlo a construcciones automáticas, pero aún no lo he visto.

creo que sirve ...

0

se prueba como esto:

[Test] 
public void ConditionQueryBuilderTest_RendersProperHtml() 
{ 
    var sw = new StringWriter(); 
    var queryBuilder = new ConditionQueryBuilderStub 
    { 
     ID = "UnitTestbuilder", 
     QueryBuilderURL = @"\SomeAspxPage\SomeWebMethod", 
     ResetQueryBuilderURL = @"\SomeAspxPage\OnQueryBuilderReset", 
     FilterValuesCollection = new Dictionary<int, string> { {15, "Some Condition"}} 
    }; 
    queryBuilder.RenderAllContents(new HtmlTextWriter(sw)); 

    AppendLog(sw.ToString()); 

    Assert.AreEqual(ExpectedHtml, sw.ToString()); // ExpectedHTML is the raw expected HTML 
} 

Aquí es mi talón de:

internal class ConditionQueryBuilderStub : ConditionQueryBuilder // ConditionQueryBuilder is a WebControl 
{ 
    internal void RenderAllContents(HtmlTextWriter writer) 
    { 
     RenderContents(writer); 
    } 
} 
Cuestiones relacionadas