2010-09-22 8 views
1

Je viens de créer un filtre d'action que je veux appliquer à presque tous mes contrôleurs (y compris les nouveaux qui seront introduits plus tard). Je pense qu'un test unitaire très utile serait celui qui fait défiler chaque contrôleur et vérifie que si certains critères sont remplis, alors le filtre d'action aura un impact sur le résultat.Unité testant tous les contrôleurs à partir d'un seul test

Est-il judicieux de créer un test unitaire qui touche plusieurs contrôleurs? Quelqu'un peut-il partager le code d'un test similaire qui s'est avéré utile?

EDIT: J'ai juste réalisé que testing an action filter pourrait être problématique. Cependant, si vous avez des idées à partager sur les tests de masse des contrôleurs ...

Répondre

3

Il n'est pas recommandé de tester plus d'une chose à la fois lors des tests.

Vous devriez également éviter la logique dans les tests (switch, if, else, foreach, for, while) car le test est moins lisible et introduit éventuellement des bogues cachés.

De nombreux tests simples, lisibles et donc maintenables qui testent chacun une seule chose sont de loin préférables à un test avec beaucoup de complexité.

RÉPONSE À VOTRE EDIT

filtres de test peut être réalisé en séparant le filtre de l'attribut. Voici un exemple: La classe LoadMembershipTypeListFilter a les 'coutures' nécessaires pour utiliser les fakes de test. C'est là que votre logique dans votre filtre est à tester.

public class LoadMembershipTypeListFilter : IActionFilter 
{ 
    private IMembershipTypeProvider _provider; 
    private IMembershipTypeAdminMapper _mapper; 

    public LoadMembershipTypeListFilter(IMembershipTypeProvider provider, IMembershipTypeAdminMapper mapper) 
    { 
     _provider = provider; 
     _mapper = mapper; 
    } 

    #region IActionFilter Members 
    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //implementation... 
    } 
    #endregion 
} 

Et l'attribut utilise ici le filtre, cet exemple résout les dépendances du filtre nécessite par un appel au localisateur de services:

public class LoadMembershipTypeListAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var filter = new LoadMembershipTypeListFilter(IocResolve.Resolve<IMembershipTypeProvider>(), IocResolve.Resolve<IMembershipTypeAdminMapper>()); 
     filter.OnActionExecuting(filterContext); 
    } 
} 

Et votre contrôleur utilise l'attribut:

[LoadMembershipTypeList] 
public ActionResult Create() 
{ 
    return View(); 
} 
+0

+1 pour l'exemple de testabilité. –

2

Puisque vous allez très probablement écrire des tests unitaires pour chaque contrôleur, vous pouvez toujours avoir une classe de base de test unitaire qui teste le filtre d'action . Tout test de contrôleur utilisant le filtre d'action hériterait de cette classe pour tester également le filtre d'action.

1

Je dirais qu'à ce stade, vous testez l'infrastructure. Si vous souhaitez vérifier que les filtres sont appliqués dans les méthodes que vous attendez, utilisez la méthode de réflexion + pour faire correspondre une liste de méthodes que vous souhaitez associer. Peut-être que vous voulez vérifier que les méthodes ont une certaine signature, ce qui précède fonctionnerait également pour cela.

Si vous voulez tester le filtre d'action, allez directement contre celui-ci. Peut-être que ce dont vous avez vraiment besoin, c'est de vous assurer que différents résultats/modèles fonctionnent avec le filtre.

Questions connexes