Как создать тестируемый код с использованием классов .Net IO?

Я хочу создать модульный тестируемый код, который имитирует вызовы классов .Net System.IO, так что я действительно могу модульный тест вместо зависимости от файловой системы. Я использую классы SystemWrapper , чтобы обернуть классы BCL.

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

Проблема, с которой я столкнулся, заключается в том, что внедрение зависимости в класс не работает, потому что для создания экземпляра зависимости (через StructureMap ) необходимо знать, какой параметр конструктора передать, который при этом будет недоступен. time, также нет конструктора по умолчанию.

пример кода:

// don't want to create dependency here like so
//IFileInfoWrap fileInfoWrap = new FileInfoWrap(filename);

// using service locator (anti-pattern?!) since it can't be 
// injected in this class
var fileInfoWrap = ObjectFactory.GetInstance(
    new ExplicitArguments(new Dictionary
    {
        {"fileName", filename}
    }));

Console.WriteLine("File exists? {0}",  fileInfoWrap.Exists); 

Что мне не нравится, так это то, что зависимость не внедряется, ObjectFactory здесь не должно быть (но я не вижу другого способа создать это). ExplicitArguments делает его беспорядочным, а имя аргумента представляет собой волшебную строку.

Чтобы это работало, класс конфигурации StructureMap должен четко знать, какой конструктор я хочу использовать (я только начал с StructureMap, так что это может быть неправильный способ его настройки):

ObjectFactory.Initialize(x =>
{
    x.Scan(scan =>
    {
        scan.AssembliesFromPath(".");
        scan.RegisterConcreteTypesAgainstTheFirstInterface();
        scan.WithDefaultConventions();
    });

    // use the correct constructor (string instead of FileInfo)
    x.SelectConstructor(() => new FileInfoWrap(null as string));

    // setting the value of the constructor
    x.For()
        .Use()
        .Ctor("fileName")
        .Is(@".");
});

Кто-нибудь нашел лучшее решение для создания тестируемого кода для классов System.IO? Я знаю, что часть проблемы заключается в дизайне классов System.IO.

7
задан Steven 9 January 2012 в 11:08
поделиться