Как выполнить модульный тест Asp.net MVC fileUpload - PullRequest
9 голосов
/ 01 апреля 2011

Здравствуйте, я новичок в разработке TDD.
Я наткнулся на этот пост для Использование asp.net mvc для загрузки файла
Фил Хаак утверждает, что класс можно использовать для управления загрузкой файлов, в котором он использует HttpFileCollectionValueProvider по умолчанию:

[HttpPost]
public ActionResult Index(HttpPostedFileBase file) {

  if (file.ContentLength > 0) {
    var fileName = Path.GetFileName(file.FileName);
    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
    file.SaveAs(path);
  }

  return RedirectToAction("Index");
}

значение ограничено в форме как

<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 анализируется как параметр в контроллере с именем «file» в форме html и как параметр синтаксического анализа в контроллере Index.

У меня есть два вопроса:
1. Как я могу проверить метод file.SaveAs?
2. Я не совсем уверен, как провести модульное тестирование с этим. В тестовом файле контроллера у меня должен быть поддельный HttpPostedFileBase, но он запечатан. У кого-нибудь есть какие-то стратегии для борьбы с этим?

Большое спасибо!

1 Ответ

7 голосов
/ 01 апреля 2011

Приношу свои извинения, если это не то, о чем вы спрашиваете, но я просто высмеиваю HttpPostedFileBase в вашем тесте:

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

и затем установите любые ожидания:

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

затем передайте это вашему методу контроллера:

controller.Index(file);

Так что вы можете высмеивать поведение вашего файла. Я не уверен насчет .SaveAs - вы переопределили этот метод?

...