2009-07-30 4 views
2

J'ai créé un filtre d'actions personnalisé afin de valider le paramètre de retour du service Web. Si le paramètre n'est pas vérifié, ActionFilter redirige l'utilisateur vers la page de maintenance.Test d'unité de filtrage d'actions de redirection personnalisé

Voici mon action Filtre

public class RequireWSValidation : ActionFilterAttribute 
{ 
    public String Controller { get; set; } 
    public String Action { get; set; } 
    public String ValidationParam { get; set; } 

    public RequireWSValidation() 
     : this(null, null) 
    { 
    } 

    public RequireWSValidation(string controller, string action) 
     : this(controller, action, "WSOk") 
    { 

    } 
    public RequireWSValidation(string controller, string action, string viewDataParam) 
    { 
     Controller = controller; 
     Action = action; 
     ValidationParam = viewDataParam; 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.Controller.ViewData[ValidationParam] == null) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = Controller, action = Action })); 
     } 
     else if ((Boolean)filterContext.Controller.ViewData[ValidationParam] == false) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = Controller, action = Action })); 
     } 
    } 
} 

Le contrôleur:

[RequireWSValidation(Controller = "Home", Action = "Maintenance", ValidationParam = "WSOk")] 
    public ActionResult About() 
    { 
     ViewData["WSOk"] = true; 

     return View(); 
    } 

    public ActionResult Maintenance() 
    { 
     return View(); 
    } 

Maintenant, je veux ce comportement ActionFilter test unitaire. Mais l'action "À propos de" renvoie toujours un ViewResult, donc je ne peux pas tester si l'ActionFilter redirige l'utilisateur vers la page de maintenance.

Mon unité d'essai:

[Fact] 
    public void Should_Redirect_To_Maintenance_On_WS_Error() 
    { 
     var controller = new HomeController(); 

     controller.ViewData["WSOk"] = false; 

     var result = controller.About() as RedirectToRouteResult; 

     Assert.NotNull(result); 
     Assert.Equal(result.RouteValues["controller"] as String, "Home"); 
     Assert.Equal(result.RouteValues["action"] as String, "Maintenance"); 
    } 

Répondre

5

filtres d'action sont gérés par le cadre (par l'invocateur d'action pour être précis). Dans votre test, vous appelez l'action directement, donc aucune "magie" supplémentaire ne se produira. Vous devriez probablement avoir deux tests - un qui vérifie que le filtre d'action fonctionne comme prévu (consultez this question pour des conseils sur la façon de le faire), et celui qui reflète sur vos contrôleurs et vérifie les contrôleurs/actions sont décorés avec votre filer.