我有十几种不同的邮件表单作为复杂的Asp.Net MVC-3网站的一部分。
每个表单都有明显不同的处理逻辑,因此每个表单在我的FormsController中都有不同的ActionMethod。
每个表单都可以通过一个路由映射中定义的URL访问:
routes.MapRoute(
"Forms",
"forms/{action}",
new { controller = "Forms", action = "Index" }
);
我在列表中持有一个动作名称列表,该列表是为DRY目的而设置的(用于填充表单的导航等)。我需要经常更新这组表单,我可能想重构表单中出现的表单名称(因此它们被定义为操作名称)。我想测试该列表对应于已定义的操作方法的名称
如果每个表单URL都被正确的路由映射捕获,那么很容易测试。我在Moq中使用NUnit:
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控制器中定义的。
另请注意:要在我的表单网址中使用短划线并仍然映射到操作方法名称,我使用过滤器定义操作名称,例如:
[ActionName("blog-subscription-request")]
public ActionResult BlogSubscriptionRequest() {...
所以......
问题:如何测试动作方法名称列表中的每个项目是否与FormsController中存在的实际ActionMethod相对应?**
答案 0 :(得分:1)
我已成功使用MvcContrib's TestHelper项目。它允许您定义路由并确保它映射到特定的Controller和Action,如下所示:
[Test]
public void homeIndex()
{
"~/forms/blog-subscription-request".ShouldMapTo<FormsController>(x => x.BlogRequest());
}
这可能不是您问题的完美解决方案,但如果您没有太多行动,这可能是一个不错的开始。