Как издеваться над IFormFile для теста unit/integration в ASP.NET Core 1 MVC 6?
Я хочу написать тесты для загрузки файлов в ASP.NET Core 1, но не могу найти хороший способ издеваться/инициализировать объект, полученный из IFormFile. Любые предложения о том, как это сделать?
Благодарю.
Ответ 1
Предполагая, что у вас есть контроллер...
public class MyController : Controller {
public Task<IActionResult> UploadSingle(IFormFile file) {...}
}
... где обращение к методу IFormFile.OpenReadStream() осуществляется с помощью тестируемого метода. Вы можете создать тест с использованием фальшивой структуры Moq для имитации данных потока.
[TestClass]
public class IFormFileUnitTests {
[TestMethod]
public async Task Should_Upload_Single_File() {
//Arrange
var fileMock = new Mock<IFormFile>();
//Setup mock file using a memory stream
var content = "Hello World from a Fake File";
var fileName = "test.pdf";
var ms = new MemoryStream();
var writer = new StreamWriter(ms);
writer.Write(content);
writer.Flush();
ms.Position = 0;
fileMock.Setup(_ => _.OpenReadStream()).Returns(ms);
fileMock.Setup(_ => _.FileName).Returns(fileName);
fileMock.Setup(_ => _.Length).Returns(ms.Length);
var sut = new MyController();
var file = fileMock.Object;
//Act
var result = await sut.UploadSingle(file);
//Assert
Assert.IsInstanceOfType(result, typeof(IActionResult));
}
}
Ответ 2
почему бы не создать реальный экземпляр в памяти
IFormFile file = new FormFile(new MemoryStream(Encoding.UTF8.GetBytes("This is a dummy file")), 0, 0, "Data", "dummy.txt");