При написании модульных тестов для одного из моих классов обслуживания в ASP.Net Core Web API мне нужно было смоделировать IFormFile
. Поэтому я решил сделать это так (используя moq):
fileMock.Setup(x => x.CopyToAsync(It.IsAny<Stream>(), It.IsAny<CancellationToken>()))
.Callback(() =>
{
Console.WriteLine("File Copied");
})
.Returns(Task.CompletedTask);
Метод, который я хочу протестировать, с радостью принимает этот макет, и все выглядело нормально, пока я не проверил расположение файла, указанное для целей тестирования, здесь:
.
Это показалось мне немного странным, так как я ожидал, что файл не будет создан (особенно потому, что мои операторы обратного вызова и возврата никогда не касаются потока). Я пытался изменить макет (например, без какого-либо обратного вызова или с немедленным закрытием потока), но не повезло, что файл все еще создается.
Затем я проверил свою реализацию операции сохранения файла:
public async Task<Result> SaveFileToDiskAsync(string filePath, IFormFile file, CancellationToken token)
{
//Checking if values are correct
try
{
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream, token).ConfigureAwait(false);
return Result.Ok();
}
}
catch (Exception e)
{
//Logging
}
}
И вот где я застрял. Я не вижу, что не так с этим методом, особенно потому, что он, кажется, делает правильно с копированием файла (он просто делает это в неправильное время).
Поэтому мой вопрос: есть ли лучший способ реализовать макет или метод для остановки FileCreation?