Я пишу метод, который будет писать в текстовый файл. Я все еще пытаюсь осмыслить инверсию зависимостей.
Проблема, с которой я столкнулся, связана с издевательством над 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, поэтому, когда я добавил этот код, мой старый тест сломался (тот, который я опубликовал).
StreamWriter - это проблема реализации, которую также можно абстрагировать.
@MickyD, Но разве в настоящем модульном тестировании мы не должны высмеивать ВСЕ зависимости? В идеале у нас была бы еще одна библиотека интеграционных тестов для тестирования кода со всеми производственными зависимостями.
@ShervinShahrdar совсем нет. Вы только высмеиваете то, что недоступен; недоступен; или дорого, чтобы проверить. Например, наша фирма взаимодействует с морским оборудованием или контролирует его, потому что единственный способ проверить его - это быть на лодке.





Я закончил рефакторинг своего кода, чтобы использовать File.WriteAllText и File.AppendText, поэтому мне не нужно было добавлять еще одну зависимость.
Вам нужно создать макет для StreamWriter и вернуть его в текущей закомментированной строке вместо фактического StreamWriter.
Тогда он не получит доступ к файлу. Вы можете просто проверить, действительно ли метод Write(string) с данным сообщением был вызван в макете StreamWriter.
Кстати, выбросьте насмешку в мусорное ведро. Если вам не нужно тестировать оборудование, которого у вас нет, например, компьютер для управления полетом; радиолокационный блок; или микроволновая печь, вы должны тестировать с использованием реального производственного кода; базы данных и коммуникационные API. Все насмешки вызывают у вас ложное чувство уверенности.