【问题标题】:How to receive a HttpRequest into an MVC 3 controller action?如何将 HttpRequest 接收到 MVC 3 控制器操作中?
【发布时间】:2012-05-24 12:02:24
【问题描述】:

当前解决方案

所以我有一些非常相似的东西

[HttpPost]
    public ActionResult Upload()
    {
        var length = Request.ContentLength;
        var bytes = new byte[length];

        if (Request.Files != null )
        {
            if (Request.Files.Count > 0)
            {
                var successJson1 = new {success = true};
                return Json(successJson1, "text/html");
            }
        }
...
        return Json(successJson2,"text/html");
    }

可单元测试的解决方案?

我想要这样的东西:

[HttpPost]
public ActionResult Upload(HttpRequestBase request)
{
    var length = request.ContentLength;
    var bytes = new byte[length];

    if (request.Files != null )
    {
        if (request.Files.Count > 0)
        {
            var successJson1 = new {success = true};
            return Json(successJson1);
        }
    }

    return Json(failJson1);
}

但是这失败了,这很烦人,因为我可以从基类制作一个 Mock 并使用它。

注意事项

  • 我知道这不是解析表单/上传的好方法,并且会 想说说这里还有其他事情(即本次上传 可以是表单或 xmlhttprequest - 操作不知道哪个)。
  • 使“请求”单元可测试的其他方法也很棒。

【问题讨论】:

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


    【解决方案1】:

    您的控制器上已有 Request 属性 => 您无需将其作为操作参数传递。

    [HttpPost]
    public ActionResult Upload()
    {
        var length = Request.ContentLength;
        var bytes = new byte[length];
    
        if (Request.Files != null)
        {
            if (Request.Files.Count > 0)
            {
                var successJson1 = new { success = true };
                return Json(successJson1);
            }
        }
    
        return Json(failJson1);
    }
    

    现在您可以在单元测试中模拟 Request,更具体地说,模拟具有 Request 属性的 HttpContext:

    // arrange
    var sut = new SomeController();
    HttpContextBase httpContextMock = ... mock the HttpContext and more specifically the Request property which is used in the controller action
    ControllerContext controllerContext = new ControllerContext(httpContextMock, new RouteData(), sut);
    sut.ControllerContext = controllerContext;
    
    // act
    var actual = sut.Upload();
    
    // assert
    ... assert that actual is JsonResult and that it contains the expected Data
    

    【讨论】:

    • 谢谢,这正是我需要知道的。
    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多