Ответ 1
Используйте SystemWrapper, библиотека, которая предоставляет интерфейсы и mockable упаковщики классы для многих классов .NET, которые не реализуют интерфейсы сами.
Я пишу несколько модульных тестов для созданного мной класса логгера, и я хочу имитировать класс файла. Я не могу найти интерфейс, который мне нужно использовать для создания MOQ... так как вы успешно MOQ класс без интерфейса?
Мне также не ясно, как я могу использовать инъекцию зависимостей, не имея доступного интерфейса:
private FileInfo _logFile;
public LogEventProcessorTextFile(FileInfo logFile) {
_logFile = logFile;
}
Когда я действительно хочу сделать что-то вроде этого (обратите внимание на IFileInfo вместо FileInfo):
private IFileInfo _logFile;
public LogEventProcessorTextFile(IFileInfo logFile) {
_logFile = logFile;
}
Используйте SystemWrapper, библиотека, которая предоставляет интерфейсы и mockable упаковщики классы для многих классов .NET, которые не реализуют интерфейсы сами.
Создайте свой код, чтобы вместо прямого доступа к классу FileInfo
, получить доступ к интерфейсу (названному, например, IFileInfo
), с теми же возможностями. В производственном коде вы будете использовать класс, который просто делегирует все свои функциональные возможности классу FileInfo
, но для модульного тестирования вы можете издеваться над интерфейсом.
Например, в приложении, которое я сделал, что действовало по-разному в зависимости от текущей даты, я объявил следующий интерфейс:
interface IDateTimeProvider
{
DateTime Today();
}
И производственный класс был просто:
class DateTimeProvider : IDateTimeProvider
{
public DateTime Today()
{
return DateTime.Today;
}
}
Вы можете дополнить этот подход с помощью механизма впрыска зависимостей, чтобы решить, следует ли использовать настоящий класс или макет в каждом случае.
Это может помочь вам облегчить создание классов-оболочек для статических или несовместимых сторонних классов. Этот инструмент создаст интерфейс и конкретный класс оболочки любого существующего класса, такого как System.IO, прямо на вашем проекте Visual Studio.