2

作为一个复杂的 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?**

4

1 回答 1

1

我已经成功使用了 MvcContrib 的 TestHelper项目。它允许您定义路由并确保它映射到特定的控制器和操作,如下所示:

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

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

于 2012-09-19T06:05:57.270 回答