Модульное тестирование System.IO.FileStream

#unit-testing #filestream

#модульное тестирование #filestream

Вопрос:

Кто-нибудь знает, как я могу написать модульный тест для функции, которая содержит FileStream?

Ответ №1:

Было бы полезно иметь больше контекста вокруг того, что вы на самом деле пытаетесь протестировать. Вы пытаетесь проанализировать поток / записать в поток / что-то еще?

Здесь лучше всего было бы, чтобы эта функция использовала Stream вместо FileStream. Таким образом, в вашем тестировании вы могли бы использовать поток в памяти и передавать ему нужные данные вместо того, чтобы создавать тестовый файл в файловой системе. Это выгодно, потому что ваш тест будет выполняться быстрее, не будет зависеть от состояния компьютера и не будет нуждаться в коде настройки / демонтажа, который касается системы.

В общем, в вашей системе должно быть очень мало компонентов, которые должны напрямую взаимодействовать с файловой системой / базой данных / etc. На самом деле вам нужен либо поток, либо объект более высокого уровня, который просто случайно сохраняется где-то в файле.

Ответ №2:

Что ж, это уже не модульный тест, а интеграционный, поскольку вы зависите от внешней системы => файловая система. Таким образом, вы могли бы передать в качестве параметра методу путь к файлу, а затем воссоздать некоторый файл образца для тестового проекта, а затем утвердить что-либо в этом файле. Вы могли бы работать с относительными именами файлов и всегда помечать файл как Copy, чтобы он развертывался для каждой итерации тестирования.

Ответ №3:

Если бы вы классифицировали используемый интерфейс IDbFileIo, показанный здесь, тогда вы могли бы создать фиктивное возвращаемое значение потока памяти вместо загрузки фактического файла.

 public interface IDbFileIo
{
    MemoryStream LoadFile(); 
}
  

… реализация

 public MemoryStream LoadFile()
{
    string databasePath = _pathInfo.GetFullDatabasePath();
    using (FileStream fileStream = new FileStream(databasePath, FileMode.Open, FileAccess.Read))
    {
        MemoryStream memoryStream = new MemoryStream();
        memoryStream.SetLength(fileStream.Length);
        fileStream.Read(memoryStream.GetBuffer(), 0, (int)fileStream.Length);

        return memoryStream;
    }
}