2008-08-27 6 views
13

Très bien.ASP.NET - Comment testez-vous UnitControls?

Alors je pense qu'il est temps que je me lance dans les tests unitaires, puisque tout le monde en parle depuis assez longtemps. J'ai installé NUnit et j'ai suivi quelques tutoriels de type "intro to unit test".

Je suis en train de mettre en place un petit framework pour aider à la reconstruction de l'une de nos applications web, j'ai donc créé un projet VS2008 pour mon framework et je veux le tester au fur et à mesure.

Comment diable puis-je tester les WebControls? Les méthodes sont toutes protégées ou privées, et comme c'est un framework, il n'y a pas grand-chose d'autre que WebControls.

Des pointeurs?

Brûlures

Répondre

8

Vous pouvez faire des architectures de type model-view-controller ou model-view-presenter sans utiliser de framework complet. Vous avez déjà découvert que le test de l'unité d'interface utilisateur est difficile. Il y a des façons de contourner cela, mais vous ne voulez probablement pas suivre cette voie. Habituellement, cela rendra vos tests très difficiles à maintenir, plus de cauchemars de maintenance est quelque chose dont les programmeurs peuvent se passer :-)

Essayez de séparer la fonctionnalité que vous voulez tester dans une classe "contrôleur" ou "présentateur". Ensuite, testez cette classe. Pour le rendre plus testable, vous pouvez masquer la classe usercontrol (la vue) derrière une interface et faire en sorte que le contrôleur ou le présentateur communique avec la vue via l'interface. De cette façon, vous pouvez simuler la vue dans vos tests.

Je sais que cela ressemble à beaucoup de travail et il semble comme une solution de contournement, mais si vous êtes habitué à cela, il est une architecture agréable qui fait vraiment beaucoup plus facile de changer les comportements ui. Vous pouvez toujours commencer à utiliser un "vrai" framework mvc quand vous en avez vraiment besoin :-)

5

Ues l'__gVirt_NP_NN_NNPS<__ attribut assembly:InternalsVisibleTo et vous serez en mesure d'accéder à ces députés.

le mettre dans votre AssemblyInfo.cs du projet webcontrol (sous Propriétés nœud)

[assembly:InternalsVisibleTo("YourTestProjectName")] 
3

Vous avez trouvé le plus grand point de douleur de ASP.NET. En ce qui concerne les classes privées scellées qui entravent les tests unitaires. Ceci est la principale raison pour laquelle les gens de TDD utiliseront un framework MVC (ASP.NET MVC, Castle MonoRail) car il fournit une séparation claire de vos modèles d'affichage et de votre logique de contrôleur. Les contrôleurs sont entièrement testables.

0

Le framework MVC mentionné ci-dessus est le meilleur moyen de tester ce que fait le contrôle. Cependant, tester comment cela fonctionne est un peu différent.

Ceci est complètement hors de la manchette, mais vous pouvez demander au contrôle utilisateur d'exposer certaines méthodes et propriétés protégées pour renvoyer des informations de validation, puis d'en faire hériter un contrôle utilisateur de test. Ce contrôle pourrait peupler les champs, appuyer sur les boutons et autres. Un peu désordonné mais ça pourrait marcher.

0

Vous pouvez également jeter un oeil à ce cadre Rhino Igloo. C'est un framework MVC compromis pour WebForms.

1

This est un ancien article maintenant, mais j'utilisais NUnitASP pour écrire des tests nunit pour asp.net WebControls en 2004.Cet article donne un exemple détaillé de test d'un contrôle simple en utilisant leur concept de création d'une classe "Tester" correspondante qui encapsule les détails de votre contrôle à partir de vos tests. Le testeur peut (devrait) également être dans le même assemblage que votre contrôle afin de partager certaines choses entre eux (par exemple, les fonctions d'utilité, les constantes, etc.).

J'ai utilisé la technique (et d'autres utilisent des variantes de la technique) encore aujourd'hui pour tester des contrôles très sophistiqués.

J'espère que c'est utile.

+1

Pour scott, ce lien est brisé maintenant :( – Jono

+2

@ JonoRR Remerciez Dieu pour archive.org: http://web.archive.org/web/20080705112750/http://blogs.pingpoet.com/overflow/archive/2004/03/18/474.aspx BTW: J'ai un sauvegarde de ce site, et ont ajouté une tâche à ma liste de todo pour le récupérer p. Je dirige les URLs mortes (bien que, franchement c'est une tâche de basse priorité). –

0

Ivonna peut tester WebControls dans l'isolement, dans le contexte Asp.Net Il suffit d'appeler session.GetControl (« Path.ascx ») et vérifier qu'il possède toutes les propriétés nécessaires.

1

Vous pouvez également examiner les composants de test via le navigateur comme un utilisateur les verrait en utilisant un framework de test tel que WebAii. Je l'ai vu fonctionner et c'est plutôt cool. On m'a également dit que vous pouvez le brancher sur des builds automatisés mais je ne l'ai pas encore vu.

Hope it helps ...

0

-vous verifié comme ceci:

[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 
} 

Voici mon talon:

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