当前解决方案

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

[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-操作不知道哪个)。
使“请求”单元可测试的其他方法也很棒。

最佳答案

您的控制器上已经有一个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

关于c# - 如何接收到MVC 3 Controller Action 的HttpRequest?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10737134/

10-11 04:59