我正在将线程文化设置为通过HttpRequest中的Cookie发送的文化,该文本是在我创建的基本控制器的initialize方法中进行的。我现在想为这个功能创建一个单元测试。单元测试Controller.Initialize
在测试中,我创建了一个模拟HttpContext并添加了Cookie。使用这个和一个routeData帮助器,我创建一个RequestContext。然后我创建一个新的控制器并在其上调用传递给RequestContext的Execute。
我首先遇到了有关TempData和SessionState的问题,我通过设置TempData并在控制器上创建一个EmptyTempDataProvider来解决这个问题。
然后我有一个VirtualPathProviderViewengine的问题,我通过创建一个VoidActionInvoker来解决这个问题。
这是测试初始化方法的最佳方法吗?任何类似的事情,愿意分享一些代码?
感谢, 乔恩
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);
}
}
}