2009-01-15 135 views
3

我正在将线程文化设置为通过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); 
    } 
} 
} 

回答

1

听起来我的权利,initialize方法需要一个参数,需要一个HttpContext的,如果我有你的右后你嘲笑这些对象和添加的RequestContext要测试的值,然后确保您的方法正常工作。听起来和我想要的完全一样。我不介意看到一些代码。

编辑:您的测试看起来不错。