2009-01-15 7 views
3

Je mets la culture de threads à la culture envoyée via un cookie sur le HttpRequest dans la méthode initialize d'un contrôleur de base que j'ai créé. Je veux maintenant créer un test unitaire pour cette fonctionnalité.Unit testing Controller.Initialize

Dans le test, j'ai créé un faux HttpContext et ajouté le cookie. En utilisant ceci et une aide routeData, je crée un RequestContext. Ensuite, je crée un nouveau contrôleur et appelle Execute en passant dans le RequestContext.

J'ai d'abord rencontré un problème concernant TempData et SessionState, que j'ai corrigés en définissant TempData et en créant un EmptyTempDataProvider sur le contrôleur.

Ensuite, j'ai eu un problème avec le VirtualPathProviderViewengine, que j'ai corrigé en créant un VoidActionInvoker. Est-ce la meilleure façon de tester la méthode initialize?

Tout faire quelque chose de similaire et prêt à partager du code?

Merci, Jon

namespace MyApp.UnitTests { 
[TestClass] 
public class ControllerTests { 
    [TestInitialize] 
    public void Setup() { 
     RouteTable.Routes.Clear(); 
     MyApp.MvcApplication.RegisterRoutes(RouteTable.Routes); 
    } 

    [TestMethod] 
    public void Thread_culture_should_be_set_to_cookie_culture() { 
     // Arrange 
     var context = HttpMockHelper.FakeHttpContext(); 
     context.Request.Cookies.Add(new HttpCookie(CultureService.CookieName, "nl-NL")); 
     var reqContext = new RequestContext(context, "~/Home/Landing".Route()); 
     var controller = new HomeController { 
      TempData = new TempDataDictionary(), 
      TempDataProvider = new EmptyTempDataProvider(), 
      ActionInvoker = new VoidActionInvoker() 
     }; 

     // Act 
     (controller as IController).Execute(reqContext); 

     // Assert 
     Assert.AreEqual("nl-NL", Thread.CurrentThread.CurrentCulture.Name); 
    } 
} 

internal class VoidActionInvoker : ControllerActionInvoker { 
    protected override ActionExecutedContext InvokeActionMethodWithFilters(System.Reflection.MethodInfo methodInfo, IDictionary<string, object> parameters, IList<IActionFilter> filters) { 
     return new ActionExecutedContext(this.ControllerContext, false, null); 
    } 

    protected override void InvokeActionResult(ActionResult actionResult) { 
    } 
} 

internal class EmptyTempDataProvider : ITempDataProvider { 
    public void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values) { 
    } 

    public IDictionary<string, object> LoadTempData(ControllerContext controllerContext) { 
     return new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); 
    } 
} 
} 

Répondre

1

Sons droit à moi, la méthode d'initialisation prend un paramètre pour la RequestContext qui nécessite une HttpContext, si j'ai votre droit de poste vous moquant ces objets et en ajoutant les valeurs que vous voulez tester et ensuite vous assurer que votre méthode fonctionne correctement. Cela ressemble exactement à ce que je ferais. Cela ne me dérangerait pas de voir une partie du code.

Editer: Vos tests me vont bien.