Как загрузить файл в конечную точку из интеграционного теста - PullRequest
3 голосов
/ 01 июля 2011

Когда файл загружен с клиента, его можно найти в this.Request.Files, который имеет тип HttpFileCollectionBase.

HttpFileCollectionBase содержит HttpPostedFileBase записей.

Свойства этих объектов доступны только для чтения, поэтому я надеялся, что смогу настроить некоторые макеты. Мой ложный запрос вернул бы макет HttpFileCollection, и эта коллекция содержала бы один макет HttpPostedFile. Свойство InputStream этого объекта вернуло бы объект FileStream, который я бы создал, используя реальный файл в системе контроля версий.

  1. Это хороший подход к загрузке файл в конечную точку из интеграционный тест?
  2. Если это хороший подход, как я могу это высмеять с Moq?
  3. Если это не очень хороший подход, можете ли вы предложить лучший способ?

Спасибо!

1 Ответ

4 голосов
/ 02 июля 2011

Я ничего не знаю о asp.net mvc, но похоже, что вам нужно было бы сделать что-то подобное для настройки ложных зависимостей:

MemoryStream stream = new MemoryStream();

var mockFile = new Mock<HttpPostedFileBase>();
var mockFiles = new Mock<HttpFileCollectionBase>();
var mockRequest = new Mock<HttpRequestBase>();

mockFile.Setup(f => f.InputStream).Returns(stream);

// if for example, you index the file by name.
mockFiles.Setup(f => f[It.IsAny<string>()]).Returns(mockFile.Object);

mockRequest.Setup(r => r.Files).Returns(() => mockFiles.Object);

// write expected data to your memory stream, then instantiate your class 
// under test using the mockRequest.Object

В модульном тесте я бы использовал поток памятискорее файл, но файловый поток работает так же.

Если вы хотите избежать макетирования и установки всех этих зависимостей, вы можете поместить их за абстракцию UploadedFiles, сделать свой код зависимым от абстракции и только макетировать UploadedFiles.Для получения потока файлов по имени (или как бы вы к ним не обращались) требуется всего лишь тонкая оболочка около Request.Files.Это лучше, потому что нисходящий код теперь зависит от UploadedFiles, Stream и string, а не HttpRequestBase, HttpFileCollectionBase, HttpPostedFileBase, Stream и string.

Настройка будет упрощена до следующего вида:

MemoryStream stream = new MemoryStream();
var mockUploadedFiles = new Mock<UploadedFiles>();
mockUploadedFiles.Setup(u => u.GetFile(It.IsAny<string>())).Returns(stream);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...