模拟Request.Files来测试空文件上传

时间:2010-07-16 09:52:47

标签: unit-testing asp.net-mvc-2 moq

我正在尝试对文件上传进行单元测试,但似乎缺少某些东西。

控制器在httpPost处理程序中包含这个相当标准的块:

foreach (string file in Request.Files) {
    var postedFile = Request.Files[file] as HttpPostedFileBase;
    if (postedFile.ContentLength == 0)
        continue;
    var fileName = "~/Uploaded/" + Path.GetFileName(postedFile.FileName);
    postedFile.SaveAs(Server.MapPath(fileName));
}

对于我使用Moc的unittest:

var mock = new Mock<ControllerContext>();

mock.Setup(p => p.HttpContext.Request.Files.Count).Returns(0);

// also tried unsuccessfully:
// var collection = new Mock<HttpFileCollectionBase>();
// mock.Setup(p => p.HttpContext.Request.Files).Returns(collection.Object);
// mock.Setup(p => p.HttpContext.Request.Files.AllKeys).Returns(new string[] {});

var controller = CreateReportsController();
controller.ControllerContext = mock.Object;

我希望被模拟的上下文可以在没有任何文件上传的情况下模拟有效请求。相反,它会在foreach语句中失败,并带有nullreference异常。我明白为什么,因为我实际上没有设置Request.Files,但我不确定如何做得更好。

那么,我该如何正确配置moc上下文?

谢谢, 达菲

1 个答案:

答案 0 :(得分:1)

您需要创建一个自动递归模拟:

var mock = new Mock<ControllerContext> { DefaultValue = DefaultValue.Mock };

此处提供了更多Moq解决方案:http://code.google.com/p/moq/wiki/QuickStart