【问题标题】:Test if ActionMethod exists in Controller测试Controller中是否存在ActionMethod
【发布时间】:2012-09-05 12:26:37
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这看起来很有帮助:对控制器和方法的引用是键入的,而不是字符串,因此如果类型不存在 (+1),测试将不会编译。我试试看……
    • 是的,很好,它们被键入并且如果重命名将级联整个项目,但很糟糕,因为您不能使用 TestCase 或 TestCastSource 一次运行多个测试。
    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 2011-02-16
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多