【问题标题】:testing ASP.NET MVC controller Httpget测试 ASP.NET MVC 控制器 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 段而不是让绑定工作来填充它(或自定义活页夹)?

标签: c# asp.net-mvc asp.net-mvc-3 testing


【解决方案1】:

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

查看您的 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)
    {

    }  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多