Мокрый StreamWriter (C # Moq) - PullRequest
0 голосов
/ 12 мая 2018

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

Похоже, у меня проблема с насмешкой 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 is null Когда я использую закомментированную строку кода, которая возвращает StreamWriter, я получаю сообщение об ошибке, в котором запрещен доступ к файлу. Однако я не хочу на самом деле читать файл на жестком диске. Как я могу насмехаться над StreamWriter?

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

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

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

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

0 голосов
/ 22 мая 2018

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

...