Как правильно вернуть поток (Stream) из метода?

211
19 июля 2017, 21:12

ДО рефакторинга

Есть метод

public Stream Write()
{
    var assembly = Assembly.GetExecutingAssembly();
    using (Stream stream = assembly.GetManifestResourceStream("Monit95App.Services.Resource.particip-list.xlsx"))
    {                
        var templateBook = new XLWorkbook(stream);
        var templateSheet = templateBook.Worksheets.First();                
        templateSheet.Cell("C2").Value = "Отчет";
        var memoryStream = new MemoryStream();
        templateBook.SaveAs(memoryStream);             
        return memoryStream;
    }
}

и юнит-тест под него

[TestMethod]
public void WriteTest()
{       
    //Arrange
    var writer = new RsurReportModelXlsxConverter();
    //Act
    var stream = writer.Write();
    var templateBook = new XLWorkbook(stream);
    var templateSheet = templateBook.Worksheets.First();
    var c2Value = templateSheet.Cell("C2").Value.ToString();
    //Assert
    Assert.IsNotNull(stream);
    Assert.AreEqual("Отчет", c2Value);
}

И сейчас тест проходит.

ПОСЛЕ рефакторинга

Делая ревью мне не понравилось использование дополнительного потока MemoryStream для возврата данных из метода в виде потока-данных.

Также хочется отметить, что копаясь в исходниках .NET мне не удалось узнать объект какого типа возвращает GetManifestResourceStream. Но подозревая что это FileStream.

И вот как я изменил метод

public Stream Write()
{
    var assembly = Assembly.GetExecutingAssembly();
    using (Stream stream = assembly.GetManifestResourceStream("Monit95App.Services.Resource.particip-list.xlsx"))
    {                
        var templateBook = new XLWorkbook(stream);
        var templateSheet = templateBook.Worksheets.First();                
        templateSheet.Cell("C2").Value = "Отчет";                        
        return stream;
    }
}

и получил исключение

Вопрос

Почему так происходит? Можно ли в моем случае обойтись одним потоком?

READ ALSO
Автоматическое обновление DataGrid

Автоматическое обновление DataGrid

Есть коллекция категорий с продуктами

193
Как сделать, чтобы на странице мог находиться только 1 юзер?

Как сделать, чтобы на странице мог находиться только 1 юзер?

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

185
Как тестировать private и protected методы? [дубликат]

Как тестировать private и protected методы? [дубликат]

На данный вопрос уже ответили:

237