测试 ASP.NET MVC 控制器 Httpget

Posted

技术标签:

【中文标题】测试 ASP.NET MVC 控制器 Httpget【英文标题】:testing ASP.NET MVC controller Httpget 【发布时间】:2012-02-24 09:06:33 【问题描述】:

我们刚刚开始使用 ASP.NET MVC3,我们想要对我们的控制器进行单元测试。

这是我的控制器功能:

[HttpGet]
Public ActionResult Action()

  Guid Id = Guid.Empty;
            string[] UrlSegments = Request.Url.Segments;
            Guid.TryParse(UrlSegments[UrlSegments.Count() - 1], out Id);
            if(Id == Guid.Empty)
                return RedirectToAction("ErrorPage");
  

我想测试这个控制器功能。我已经在我的 global.asax 文件中放置了匹配的路由来匹配这个功能。基本上我正在尝试从 URl 中检索 guid,如果它不好,则将他带到错误页面。 HttpRequestBase 类 URl 没有设置器,所以我很困惑如何测试这个功能?

【问题讨论】:

我将“if(Id == Guid.Empty)”更改为“if(activationId == Guid.Empty)”,希望这是要比较的内容。 谢谢...我清理了 id 的东西 什么不工作以及如何工作?无论如何,我都会用 UrlSegments.Length 替换 UrlSegments.Count()... 我想用mock来测试这个功能。我怎样才能做到这一点?我不知道如何使用“localhost/action/guid”之类的 URl 创建请求对象 好奇你为什么要检查 url 段而不是让绑定工作来填充它(或自定义活页夹)? 【参考方案1】:

至于测试阅读comments above 中提供的链接,但我建议阅读MVC Routing 或here,它完全符合您的目标。

查看您的 global.ascx.cs 文件,您会发现类似这样的内容:

routes.IgnoreRoute("resource.axd/*pathInfo");

routes.MapRoute(
  "Default", // Route name
  "controller/action/id", // URL with parameters
  new  controller = "Home", action = "Index", id = UrlParameter.Optional  // Parameter defaults
);

这是 MVC 框架开箱即用的路线。

路由会根据你给它们的约定匹配一个 url。

所以根据上面的默认路由,给定一个这样的url:

http://localhost:portnumber/MyController/MyAction/8B4B93DE-76CA-4552-B4AA-460400761EAD

它将尝试将此 url 匹配到一个名为 MyController 的控制器,其中包含一个名为 MyAction 的操作,该操作接收和 Id。只有在所有条件都匹配时才会执行此操作。

如果 URL 中没有 id 并且在您的操作方法上定义的 id 不是可空类型,那么它就不会执行。它宁愿尝试匹配另一个 Url,如果找不到它会给出 404。

像这样:

public class MyController : Controller 

    [HttpGet]
    Public ActionResult MyAction(Guid id)
    

      

【讨论】:

以上是关于测试 ASP.NET MVC 控制器 Httpget的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Core MVC API 控制器上对 AuthorizeAttribute 进行单元测试

asp.net mvc中的单元测试问题?

模拟 Asp.net-mvc 控制器上下文

asp.net mvc 自动化测试工具

asp.net 如何变成 MVC 或 WebApi?

沙盒测试第二次支付失败 Paypal 集成 asp.net mvc