Я ничего не знаю о 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);