2010-09-10 18 views
1

J'utilise MvcContrib et TestControllerBuilder pour écrire des tests pour mon contrôleur.Renvoi de UserHostAddress spécifique à l'aide de TestControllerBuilder

Je vous écris les tests pour mon erreur de manipulation du contrôleur qui ressemble à ceci:

public JsonResult HttpError() 
    { 
     Exception ex = null; 

     try 
     { 
      ex = (Exception)HttpContext.Application[Request.UserHostAddress.ToString()]; 
     } 
     catch 
     { 
     } 

     if(ex != null) 
     { 
      return Json(new ErrorViewModel() { Message = ex.Message, Source = ex.Source, StackTrace = ex.StackTrace, Type = ex.GetType().Name}, JsonRequestBehavior.AllowGet); 
     } 
     else 
     { 
      return Json(new ErrorViewModel() { Message = "An error has occured." }, JsonRequestBehavior.AllowGet); 
     } 
    } 

Fondamentalement, ma gestion globale d'erreur met la dernière exception dans le magasin d'application et ce contrôleur essaie de le tirer en arrière sur, convertissez-le en JSON et renvoyez-le (nous renvoyons tout comme JSON car ces méthodes ne sont appelées que Web Services).

Pour tester complètement cela, j'ai besoin que UserHostAddress contienne quelque chose de prévisible, mais les objets configurés par TestControllerBuilder laissent cette propriété nulle.

Comment est-ce que je peux faire ce travail? Je ne sais pas comment je peux faire ce travail dans mon test.

Répondre

4

TestControllerBuilder utilise Rhino.Mocks pour se moquer de HttpContext. Sachant cela, vous pouvez mettre l'objet de demande de retour en mode « record » et bouchonner une réponse:

controller.Request.BackToRecord(); 
controller.Request.Stub(r => r.UserHostAddress).Return("75.142.12.45"); 
controller.Request.Replay(); 

Faites ceci après avoir initialisé le contrôleur, mais avant l'appel de la méthode.