asp.net-mvc-3 – 单元测试一个文件上传,怎么样?

使用MVC3.NET我有一个文件上传方法一个控制器工作正常与以下签名公共ActionResult UploadFile(IEnumerable< HttpPostedFileBase>文件)

如何用NUnit单元测试?我周围环顾四周,每个人似乎都指向Moq,但我是新进单位测试,不能让Moq工作.

我发现有趣的博客,例如:http://danielglyde.blogspot.com/2011/07/tdd-with-aspnet-mvc-3-moq-and.html,但我很难想出如何做“假”文件上传也是一样的,我也很担心,我已经设法找到的moq示例很多似乎有其中已弃用的代码.

我只想知道我如何模拟一个HttpPostedFileBase,所以我可以使用Moq或其他方式来测试我的上传代码 – 如果有人可以给我一些关于如何做的代码示例,我将非常感激.

以下代码从其他示例中获取

var file = new Mock<HttpPostedFileBase>();
            file.Setup(f => f.ContentLength).Returns(1);
            file.Setup(f => f.FileName).Returns("test.txt");

controller.upload(file);

当我尝试编译时会产生以下错误

cannot convert from ‘Moq.Mock’ to
‘System.Web.HttpPostedFileBase’

我已经改变了采用单一HttpPostedFileBase的方法,而不是一个IEnumerable,因为能够“嘲笑”一个是我正在为了这个问题的目的而着重关注的.

解决方法

假设标准文件上传操作:
[HttpPost]
public ActionResult UploadFile(IEnumerable<HttpPostedFileBase> files)
{
    foreach (var file in files)
    {
        var filename = Path.Combine(Server.MapPath("~/app_data"),file.FileName);
        file.SaveAs(filename);
    }
    return View();
}

你可以这样测试:

[Test]
public void Upload_Action_Should_Store_Files_In_The_App_Data_Folder()
{
    // arrange
    var httpContextMock = new Mock<HttpContextBase>();
    var serverMock = new Mock<HttpServerUtilityBase>();
    serverMock.Setup(x => x.MapPath("~/app_data")).Returns(@"c:\work\app_data");
    httpContextMock.Setup(x => x.Server).Returns(serverMock.Object);
    var sut = new HomeController();
    sut.ControllerContext = new ControllerContext(httpContextMock.Object,new RouteData(),sut);

    var file1Mock = new Mock<HttpPostedFileBase>();
    file1Mock.Setup(x => x.FileName).Returns("file1.pdf");
    var file2Mock = new Mock<HttpPostedFileBase>();
    file2Mock.Setup(x => x.FileName).Returns("file2.doc");
    var files = new[] { file1Mock.Object,file2Mock.Object };

    // act
    var actual = sut.UploadFile(files);

    // assert
    file1Mock.Verify(x => x.SaveAs(@"c:\work\app_data\file1.pdf"));
    file2Mock.Verify(x => x.SaveAs(@"c:\work\app_data\file2.doc"));
}

显然,所有的HttpContext设置部分应该被外部化为可以在单元测试的[SetUp]阶段中调用reusable class,以准备被测试对象的模拟上下文,并避免在每个单元测试中重复它.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....