Подтвердить что ты не робот

Как сделать MOQ классом System.IO.FileInfo... или любым другим классом без интерфейса?

Я пишу несколько модульных тестов для созданного мной класса логгера, и я хочу имитировать класс файла. Я не могу найти интерфейс, который мне нужно использовать для создания MOQ... так как вы успешно MOQ класс без интерфейса?

Мне также не ясно, как я могу использовать инъекцию зависимостей, не имея доступного интерфейса:

private FileInfo _logFile;

public LogEventProcessorTextFile(FileInfo logFile) {
    _logFile = logFile;
}

Когда я действительно хочу сделать что-то вроде этого (обратите внимание на IFileInfo вместо FileInfo):

private IFileInfo _logFile;

public LogEventProcessorTextFile(IFileInfo logFile) {
    _logFile = logFile;
}
4b9b3361

Ответ 1

Используйте SystemWrapper, библиотека, которая предоставляет интерфейсы и mockable упаковщики классы для многих классов .NET, которые не реализуют интерфейсы сами.

Ответ 2

Создайте свой код, чтобы вместо прямого доступа к классу FileInfo, получить доступ к интерфейсу (названному, например, IFileInfo), с теми же возможностями. В производственном коде вы будете использовать класс, который просто делегирует все свои функциональные возможности классу FileInfo, но для модульного тестирования вы можете издеваться над интерфейсом.

Например, в приложении, которое я сделал, что действовало по-разному в зависимости от текущей даты, я объявил следующий интерфейс:

interface IDateTimeProvider
{
    DateTime Today();
}

И производственный класс был просто:

class DateTimeProvider : IDateTimeProvider
{
    public DateTime Today()
    {
        return DateTime.Today;
    }
}

Вы можете дополнить этот подход с помощью механизма впрыска зависимостей, чтобы решить, следует ли использовать настоящий класс или макет в каждом случае.

Ответ 3

Это может помочь вам облегчить создание классов-оболочек для статических или несовместимых сторонних классов. Этот инструмент создаст интерфейс и конкретный класс оболочки любого существующего класса, такого как System.IO, прямо на вашем проекте Visual Studio.

https://www.nuget.org/packages/Digitrish.WrapperGenerator/