如何对 Asp.net MVC 文件进行单元测试

Posted

技术标签:

【中文标题】如何对 Asp.net MVC 文件进行单元测试【英文标题】:How to unit test Asp.net MVC fileUpload 【发布时间】:2011-07-27 18:56:08 【问题描述】:

您好,我是 TDD 开发的新手。 我在Using asp.net mvc to upload file看到这篇文章 Phil Haack 表示可以使用一个类进行文件上传控制,其中他使用默认的 HttpFileCollectionValueProvider:

[HttpPost] 公共 ActionResult 索引(HttpPostedFileBase 文件) if (file.ContentLength > 0) var fileName = Path.GetFileName(file.FileName); var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 文件.另存为(路径); return RedirectToAction("索引");

值以如下形式限定

<form action="" method="post" enctype="multipart/form-data">
  <label for="file">Filename:</label>
  <input type="file" name="file" id="file" />
  <input type="submit" />
</form>

请注意,HttpPostedFileBase 在 html 表单中作为参数解析到名称为“file”的控制器中,并在索引控制器中作为解析参数。

我有两个问题: 1. 如何验证 file.SaveAs 方法? 2. 我不太确定如何对此进行单元测试。在测试控制器文件中,我应该有一个假的 HttpPostedFileBase 但它是密封的。有没有人有一些策略来解决这个问题?

非常感谢!

【问题讨论】:

试试这个:ASP.NET MVC: Unit Test File Upload with Moq 感谢您的回答。问题是在 Christ 的帖子中,他没有将 HttpPostedFileBase 作为参数解析到控制器中。但是,在 Phil 的方法中,控制器应该将 HttpPostedFileBase 作为与 HttpFileCollectionValueProvider 绑定的参数。这就是我在这里进行单元测试的问题...... 【参考方案1】:

如果这不是您的要求,我深表歉意,但我会在您的测试中简单地模拟 HttpPostedFileBase:

var file = MockRepository.GenerateStub<HttpPostedFileBase>();

然后设定任何期望:

file.Expect(f => f.ContentLength).Return(1);
file.Expect(f => f.FileName).Return("myFileName");

然后将其传递给您的控制器方法:

controller.Index(file);

这样您就可以模拟文件的行为。我不确定 .SaveAs - 你重写了这个方法吗?

【讨论】:

感谢您的回答。我发现问题在于我没有为 Moq 设置正确的存储库。我查看了 Moq 的文档并获得了正确的代码。

以上是关于如何对 Asp.net MVC 文件进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Core MVC API 控制器上对 AuthorizeAttribute 进行单元测试

如何对 ASP.NET Core 控制器或模型对象进行单元测试?

如何使用构造函数依赖注入对 asp.net 核心应用程序进行单元测试

测试 ASP.NET MVC 控制器 Httpget

UrlHelper 类在 Asp.net mvc 中引发空异常

ASP.NET-MVC:数据库默认值会破坏单元测试的精神吗? [关闭]