我正在使用Steve Sandersons MVC框架書(第二版)中的一些代碼。我有一個名爲Category的類,它使用我在菜單中使用的其他屬性構建RouteValueDictionary。在網站上,它工作正常,路由是正確的,鏈接輸出如表所示。但是,我努力爲他們創建一些測試。這是我的分類等級:在asp.net中測試路由MVC
public class Category
{
public Category()
{
}
public Category(int id, string title, int sortOrder, int? parentId, bool isMainCategory, bool isVisible)
{
Id = id;
Title = title ?? "Home";
SortOrder = sortOrder;
ParentId = parentId;
IsMainCategory = isMainCategory;
IsVisible = isVisible;
}
private RouteValueDictionary routeValues;
public int Id { get; set; }
public string Title { get; set; }
public int? ParentId { get; set; }
public bool IsMainCategory { get; set; }
public bool IsVisible { get; set; }
public int SortOrder { get; set; }
public List<Category> SubCategories { get; set; }
public RouteValueDictionary RouteValues {
get
{
if (routeValues == null)
{
routeValues = new RouteValueDictionary(new
{
controller = "Products",
action = "Index",
cat = Id,
categoryName = UrlWorker.CleanUrl(Title)
//,
//page = 1,
//isParent = parent
});
}
return routeValues;
}
set
{
routeValues = value;
}
}
}
這裏是我已經設置了測試:
[TestMethod]
public void CategoryGoesToCorrectRoute()
{
List<Category> list = categoryService.GetVisibleCategories();
Assert.AreEqual("/products/3/category-3", GenerateUrlViaMocks(new RouteValueDictionary(new
{
controller = "products",
action = "Index",
cat = 3,
categoryName = "category-3"
})));
//list[0].RouteValues));
}
而且GenerateUrlViaMocks方法:
private string GenerateUrlViaMocks(object values)
{
// Arrange (get the routing config and test context)
RouteCollection routeConfig = new RouteCollection();
RegisterAllAreas(routeConfig);
MvcApplication.RegisterRoutes(routeConfig);
var mockContext = MakeMockHttpContext(null);
RouteData routeData = routeConfig.GetRouteData(mockContext.Object);
RequestContext context = new RequestContext(mockContext.Object, routeData);
// Act (generate a URL)
return UrlHelper.GenerateUrl(null, null, null,
new RouteValueDictionary(values), routeConfig, context, true);
}
最後,這裏是我的路由表:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
"SizeGuide",
"products/sizing",
new { controller = "products", action = "Sizing" },
new string[] { "EliteFightKit.Web.Controllers" }
);
routes.MapRoute(
"ViewCategory",
"products/{cat}/{categoryName}",
new { controller = "products", action = "Index", cat = 0, categoryName = "" },
new string[] { "EliteFightKit.Web.Controllers" }
);
routes.MapRoute(
"ViewProduct",
"products/{cat}/{id}/{productName}",
new { controller = "products", action = "Details", cat = "", id = "", productName = "" },
new string[] { "EliteFightKit.Web.Controllers" }
);
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Sitemap",
"sitemap",
new { controller = "Sitemap", action = "Index" }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { action = "Index", id = "" },
new string[] { "EliteFightKit.Web.Controllers" }
);
routes.MapRoute(
"Root",
"",
new { controller = "Home", action = "Index", id = "" }
);
}
Th我的問題是測試的實際結果是回來作爲/ products/sizing?Count = 4 ...
...是一堆url編碼'代碼',基本上使它成爲一個字典(對不起,我不能打印實際的錯誤,此時我不在機器上,這使我能夠運行測試)。鑑於這在網站上運行,我認爲這是我在GenerateUrlViaMocks中設置的方式的一個問題。被傳遞到該方法的routeValues是正確的,所以我非常困惑,爲什麼它沒有采用我在路由參數中有'cat'和'categoryName'參數的事實。我哪裏錯了?
勞埃德