2009-01-15 3 views
3

Я устанавливаю культуру потока в культуру, отправленную с помощью cookie на HttpRequest в методе инициализации базового контроллера, который я создал. Теперь я хочу создать единичный тест для этой функции.Unit testing Controller.Initialize

В тесте я создал mock HttpContext и добавил Cookie. Используя этот и помощник routeData, я создаю RequestContext. Затем я создаю новый контроллер и вызываю Execute на нем, проходящий в RequestContext.

Сначала я столкнулся с проблемой, связанной с TempData и SessionState, которую я исправил, установив TempData и создав EmptyTempDataProvider на контроллере.

Тогда у меня возникла проблема с VirtualPathProviderViewengine, которую я исправил, создав VoidActionInvoker.

Это лучший способ протестировать метод инициализации? Любое что-либо подобное и желание поделиться каким-то кодом?

Спасибо, 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); 
    } 
} 
} 

ответ

1

Звуки прямо ко мне, метод инициализации принимает параметр для RequestContext, который требует HttpContext, если я получил свой пост право вы насмешливый эти объекты и добавления значения, с которыми вы хотите протестировать, а затем убедитесь, что ваш метод работает правильно. Звучит точно так же, как и я. Я бы не прочь увидеть некоторые из кода.

Редактировать: Ваши тесты хорошо выглядят для меня.