Модульное тестирование System.IO.FileStream - PullRequest
1 голос
/ 14 апреля 2011

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

Ответы [ 3 ]

4 голосов
/ 14 апреля 2011

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

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

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

1 голос
/ 14 апреля 2011

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

0 голосов
/ 21 июля 2011

Если вы классифицировали используемый интерфейс 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;
    }
}
...