【问题标题】:How to test that an MVC action is only accessible via HTTP POST?如何测试只能通过 HTTP POST 访问 MVC 操作?
【发布时间】:2012-12-08 01:21:01
【问题描述】:

我正在使用 MvcContrib-TestHelper 在我的应用程序上测试路由。我有一个仅限于 HTTP POST 的操作:

公共测试控制器 { [HttpPost] 公共动作结果示例() { 返回视图(); } }

下面是一个应该失败的测试示例:

[测试夹具] 公共类路由测试 { [TestFixtureSetUp] 公共无效TestFixtureSetUp() { RouteTable.Routes.Clear(); Application.RegisterRoutes(RouteTable.Routes); } [测试] 公共无效TestWithGet() { var route = "~/Test/Example".WithMethod(HttpVerbs.Get); route.ShouldMapTo(r => r.Example()); } }

但是,测试通过了!我还看到了另一个未回答的问题(对不起,错误的链接),这个问题也被提出了,而且似乎功能被破坏了。测试这条路线是否只能通过 POST 访问的更好方法是什么?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 mvccontrib mvccontrib-testhelper


    【解决方案1】:

    看起来您只是想在那里测试 ASP.NET MVC 框架。我不认为这样的测试会带来价值……

    【讨论】:

    • 他可以确保某些操作只能通过帖子进行。
    • 是的,你是对的。但是,这取决于上下文。而且我认为在大多数情况下,此类测试不相关
    • 我明白你的意思,测试属性的存在应该足够了。但是,我只是假设 WithMethod(HttpVerbs) 存在于 MvcContrib 中用于测试路由,因此传递的动词会有某种用途。
    【解决方案2】:

    使用此代码:

    var controller = new HomeController();
    var methodInfo = controller.GetType().GetMethod("MrthodName");
    var attributes = methodInfo.GetCustomAttributes(typeof(ActionMethodSelectorAttribute), true).Cast<ActionMethodSelectorAttribute>().ToList();
    

    属性 - 这是接受动词的列表

    【讨论】:

    • 不管 [HttpPost] 和 [AcceptVerbs(HttpVerbs.Post)] 之间的区别如何,这是否有效?
    • 检查一下。我几乎 90% 确定这是一样的
    • 给它一个测试,它分别看到 AcceptVerbsAttribute 和 HttpPostAttribute。反射可能与我将得到的一样接近 - 我会看看是否有任何东西更接近解析这些路由信息的实际方式,如果没有,我会很快接受这个答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2018-06-26
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多