Я пытаюсь использовать проект System.IO.Abstraction вместе с System.IO.Abstraction.TestingHelpers для макета FileStream
.
. Этот код используетсяпоток файлов, который я хочу протестировать:
private readonly IFileSystem _fileSystem;
public void ExtractImageAndSaveToDisk(IXLPicture xlPicture, string filePath)
{
using (MemoryStream ms = new MemoryStream())
{
xlPicture.ImageStream.CopyTo(ms);
using (FileStream fs = (FileStream)_fileSystem.FileStream.Create(filePath, FileMode.Create))
{
ms.CopyTo(fs);
fs.Flush();
fs.Close();
}
}
}
И вот как я настроил тестирование:
[TestMethod]
public void CheckFileIsSavedToDisk()
{
// Arrange
var mockFileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
{
{ @"c:\Test\Images\", new MockDirectoryData() },
});
var xlPicture = GetXLPicture();
var filePath = @"c:\Test\Images\myimage.jpeg";
var sut = new CostSheetImageExtractor(mockFileSystem);
// Act
sut.ExtractImagesAndSaveToDisk(xlPicture, filePath);
}
При выполнении я получаю исключение:
System.InvalidCastException: Невозможно привести объект типа 'System.IO.Abstractions.TestingHelpers.MockFileStream' к типу 'System.IO.FileStream'.
в using (FileStream fs =...
line.
Во-первых, мне нужно было изменить FileStream fs
, чтобы использовать интерфейс, который разделяют как реальные, так и фиктивные объекты, но, насколько я вижу, нет интерфейса IFileStream
, который FileStream
и MockFileStream
поделитесь, так что, полагаю, я делаю это совершенно неправильно?Есть ли способ протестировать этот код с помощью System.IO.Abstraction?
Этот существующий ответ , кажется, предполагает, что это возможно, я тоже пытался сделать это, но получил то же самоерезультаты.