如何对 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 核心应用程序进行单元测试