【问题标题】:How to unit test Asp.net MVC fileUpload如何对 Asp.net MVC 文件进行单元测试
【发布时间】: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 但它是密封的。有没有人有一些策略来解决这个问题?

非常感谢!

【问题讨论】:

  • 感谢您的回答。问题是在 Christ 的帖子中,他没有将 HttpPostedFileBase 作为参数解析到控制器中。但是,在 Phil 的方法中,控制器应该将 HttpPostedFileBase 作为与 HttpFileCollectionValueProvider 绑定的参数。这就是我在这里进行单元测试的问题......

标签: asp.net-mvc unit-testing file-upload tdd


【解决方案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 的文档并获得了正确的代码。
猜你喜欢
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
相关资源
最近更新 更多