Я хочу создать модульный тестируемый код, который имитирует вызовы классов .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.