Я устанавливаю культуру потоков в культуру, отправляемую через cookie в HttpRequest, в методе инициализации базового контроллера, который я создал. Теперь я хочу создать модульный тест для этой функции.
В тесте я создал макет 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);
}
}
}