#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;
}
}