作为一个复杂的 Asp.Net MVC-3 网站的一部分,我有十几种不同的邮件形式。
每个表单都有明显不同的处理逻辑,所以每个表单在我的 FormsController 中都有不同的 ActionMethod。
每个表单都可以通过一个路由映射中定义的 URL 访问:
routes.MapRoute(
"Forms",
"forms/{action}",
new { controller = "Forms", action = "Index" }
);
我在一个列表中保存了一个动作名称列表,该列表是为 DRY 目的而设置的(用于填充表单的导航等)。我需要经常更新这组表单,并且我可能想要重构出现在 URL 中的表单名称(因此它们被定义为操作名称)。我想测试该列表对应于已定义操作方法的名称
很容易测试每个表单 URL 是否被正确的路由映射捕获。我正在将 NUnit 与 Moq 一起使用:
MockHttpContext.Setup(x => x.Request.AppRelativeCurrentExecutionFilePath)
.Returns("~/Forms/" + formUrlName);
var routeData = Routes.GetRouteData(MockHttpContext.Object);
Assert.AreEqual("Forms", routeData.Values["Controller"].ToString());
Assert.AreEqual(formUrlName, routeData.Values["Action"].ToString());
但这并不能保证命名的动作方法本身是在 Froms 控制器中定义的。
另请注意:为了允许在我的表单 url 中使用破折号并仍然映射到操作方法名称,我正在使用过滤器定义操作名称,例如:
[ActionName("blog-subscription-request")]
public ActionResult BlogSubscriptionRequest() {...
所以...
问题:如何测试我的操作方法名称列表中的每个项目是否对应于我的 FormsController 中存在的实际 ActionMethod?**