Мокинг StreamWriter (C# Moq)

Я пишу метод, который будет писать в текстовый файл. Я все еще пытаюсь осмыслить инверсию зависимостей.

Проблема, с которой я столкнулся, связана с издевательством над StreamWriter.

Вот мой тест, я закомментировал одну из строк настройки, так как здесь моя проблема.

[Test]
    public void WriteToAutomationLog_FileDoesNotExist_CreateFile()
    {
        //arrange
        mockDirectoryWrapper.Setup(_ => _.Exists(It.IsAny<string>())).Returns(true);
        mockFileWrapper.Setup(_ => _.Exists(It.IsAny<string>())).Returns(false);
        mockFileWrapper.Setup(_ => _.CreateText(logFile.GetAutomationLogsPath() + fileName)).Verifiable();
        //mockFileWrapper.Setup(_ => _.CreateText(logFile.GetAutomationLogsPath() + fileName)).Returns(new StreamWriter(fileName)).Verifiable();

        //act
        logFile.WriteToAutomationLog(fileName, message);

        //assert
        mockFileWrapper.Verify(_ => _.CreateText(logFile.GetAutomationLogsPath() + fileName), Times.Exactly(1));
    }

Вот мой метод, который я тестирую

public void WriteToAutomationLog(string fileName, string message)
    {
        //Ensure the automation logs path still exists.
        if (_directoryWrapper.Exists(automationLogsPath))
        {
            //Check if file exists
            if (_fileWrapper.Exists(automationLogsPath + fileName))
            {
                //Append to log file
                using (StreamWriter sw = _fileWrapper.AppendText(automationLogsPath + fileName))
                {

                }
            }
            else
            {
                //Create new file
                using (StreamWriter sw = _fileWrapper.CreateText(automationLogsPath + fileName))
                {
                    sw.Write(message);
                }
            }
        }
    }

У меня есть оболочки для классов Directory и File. Проблема, с которой я сталкиваюсь, заключается в том, что когда я вызываю sw.Write (message), sw в моем тесте имеет значение null. Когда я использую закомментированную строку кода, которая возвращает StreamWriter, я получаю сообщение об ошибке в доступе к файлу. Однако я не хочу фактически читать файл на жестком диске. Как я могу издеваться над StreamWriter?

Кстати, если я закомментирую sw.Write (message), мой тест пройдёт. Эта проблема возникла, когда я добавил еще один тест для проверки sw.Write, поэтому, когда я добавил этот код, мой старый тест сломался (тот, который я опубликовал).

Кстати, выбросьте насмешку в мусорное ведро. Если вам не нужно тестировать оборудование, которого у вас нет, например, компьютер для управления полетом; радиолокационный блок; или микроволновая печь, вы должны тестировать с использованием реального производственного кода; базы данных и коммуникационные API. Все насмешки вызывают у вас ложное чувство уверенности.

MickyD 12.05.2018 03:06
StreamWriter - это проблема реализации, которую также можно абстрагировать.
Nkosi 12.05.2018 11:14

@MickyD, Но разве в настоящем модульном тестировании мы не должны высмеивать ВСЕ зависимости? В идеале у нас была бы еще одна библиотека интеграционных тестов для тестирования кода со всеми производственными зависимостями.

Vin Shahrdar 21.05.2018 21:25

@ShervinShahrdar совсем нет. Вы только высмеиваете то, что недоступен; недоступен; или дорого, чтобы проверить. Например, наша фирма взаимодействует с морским оборудованием или контролирует его, потому что единственный способ проверить его - это быть на лодке.

MickyD 22.05.2018 01:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
917
2

Ответы 2

Я закончил рефакторинг своего кода, чтобы использовать File.WriteAllText и File.AppendText, поэтому мне не нужно было добавлять еще одну зависимость.

Вам нужно создать макет для StreamWriter и вернуть его в текущей закомментированной строке вместо фактического StreamWriter.

Тогда он не получит доступ к файлу. Вы можете просто проверить, действительно ли метод Write(string) с данным сообщением был вызван в макете StreamWriter.

Другие вопросы по теме