2009-09-21 4 views
2

J'ai le remplacement ci-dessous pour faire quelques choses avec des cookies en utilisant l'objet FormsIdentity. Mais quand j'instancie un contrôleur sur mon test d'unité, cette méthode n'est pas déclenchée. Des idees pour faire cela?Comment déclencher la méthode Initialize en essayant de tester un appareil?

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     // Grab the user's login information from FormsAuth 
     _userState = new UserState(); 
     if (this.User.Identity != null && this.User.Identity is FormsIdentity) 
      this._userState.FromString(((FormsIdentity)this.User.Identity).Ticket.UserData); 

     // have to explicitly add this so Master can see untyped value 
     this.UserState = _userState; 
     //this.ViewData["ErrorDisplay"] = this.ErrorDisplay; 

     // custom views should also add these as properties 
    } 

Répondre

3

Controller.Initialize(RequestContext) est invoqué à l'intérieur ControllerBase.Execute(RequestContext), qui peut être invoquée par la mise en œuvre explicite de IController.Execute(RequestContext), de sorte que ce code va initialiser et exécuter un contrôleur:

IController controller = new TestController(); 
controller.Execute(requestContext);

Je l'ai analysé l'arbre de dépendance pour Initialize() et je ne vois pas d'autre moyen d'invoquer cette méthode sans recourir à la réflexion. Vous devrez créer le RequestContext passé à Execute() aussi bien, ce qui est plus facile car il semble que vous utilisez Moq:

var wrapper = new HttpContextWrapper(httpContext); 
var requestContext = new RequestContext(wrapper, new RouteData()); 

This link a des détails utiles sur moquant un HttpContext en utilisant Moq.

+0

Merci, Sam. J'ai été en mesure de déclencher la méthode Initialize, mais toujours obtenir des erreurs, moquant httpContext est beaucoup plus difficile que je pensais. – Geo

+0

HttpContext est l'anti-christ de testabilité - j'essaie d'éviter autant que possible, et je suis surpris qu'Initialize() soit aussi faiblement testable. Peut-être pourriez-vous envisager d'utiliser un classeur de modèle personnalisé ou une injection de dépendance de propriété au lieu d'utiliser Initialize() du tout? – Sam

Questions connexes