我正在編寫針對ASP.NET MVC應用程序的單元測試,特別是測試了我編寫的HtmlHelper擴展方法。還有就是擴展方法內的一行:如何獲得單元測試以在ASP.NET MVC中使用路線?
var innerHtml = htmlHelper.ActionLink(text, action, controller, routeValues, null);
當我運行此我的單元測試的內部,生成的URL的href爲空不管通過動作或控制器的
這裏我的單元測試:
var page = CreateProductDataPage(); //returns ProductDataPage object
var htmlHelper = Http.CreateHtmlHelperWithMocks<ProductDataPage>(new ViewDataDictionary<ProductDataPage>(page), false);
var result = htmlHelper.ProductListingBreadcrumb(true, null, null);
這裏是CreateHtmlHelperWithMocks方法:
public static HtmlHelper<T> CreateHtmlHelperWithMocks<T>(ViewDataDictionary<T> viewData, bool isLoggedIn) where T : class
{
var mockViewDataContainer = new Mock<IViewDataContainer>();
mockViewDataContainer.SetupGet(v => v.ViewData).Returns(viewData);
return new HtmlHelper<T>(GetViewContextMock(viewData, isLoggedIn).Object, mockViewDataContainer.Object);
}
最後,這裏是GetViewContextMock方法:
public static Mock<ViewContext> GetViewContextMock(ViewDataDictionary viewData, bool isLoggedIn)
{
var mock = new Mock<ViewContext>();
mock.SetupGet(v => v.HttpContext).Returns(GetHttpContextMock(isLoggedIn).Object);
mock.SetupGet(v => v.Controller).Returns(new Mock<ControllerBase>().Object);
mock.SetupGet(v => v.View).Returns(new Mock<IView>().Object);
mock.SetupGet(v => v.ViewData).Returns(viewData);
mock.SetupGet(v => v.TempData).Returns(new TempDataDictionary());
mock.SetupGet(v => v.RouteData).Returns(new RouteData());
return mock;
}
非常感謝!你節省了我的一天/晚上/晚上。我同意,多麼痛苦。是的,他們介紹了爲嘲笑開放的接口和基類,但這並不意味着它們變得容易。 – 2010-10-09 21:39:06