测试Controller中是否存在ActionMethod

时间:2012-09-12 13:09:10

标签: asp.net-mvc asp.net-mvc-3 unit-testing nunit moq

我有十几种不同的邮件表单作为复杂的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相对应?**

1 个答案:

答案 0 :(得分:1)

我已成功使用MvcContrib's TestHelper项目。它允许您定义路由并确保它映射到特定的Controller和Action,如下所示:

[Test]
public void homeIndex()
{
    "~/forms/blog-subscription-request".ShouldMapTo<FormsController>(x => x.BlogRequest());
}

这可能不是您问题的完美解决方案,但如果您没有太多行动,这可能是一个不错的开始。