Ilist <что-то> Конструктор Параметр и Autofixture
-
01-10-2019 - |
Вопрос
С использованием Автофиксировка, Я пытаюсь построить анонимный экземпляр Project
:
_f=new Fixture().Customize(new AutoMoqCustomization());
_p=_f.CreateAnonymous<Project>();
Это терпит неудачу, вызывает Project
Требование общественного конструктора IList<Partner>
public Project(/*.....*/,IList<Partner> partners){
Guard.AgainstEmpty(partners);
}
Трассировка стека не имеет смысла (по крайней мере, для меня). Просто некоторое отражение Yada-Yada:
Не удалось: System.reflection.targetinvocationException: исключение было выброшено целью вызова.
---- System.argumentException: значение не падает в ожидаемый диапазон.
В System.runtimeMethodhandle._invokeConstructor (IruntimeMeathodinfo метод, объект [] args, подписьюрустриактена и подпись, runtimetype deakeningtype)
Итак - как убедиться, что автозапись проходит в анонимных коллекции партнеров, чтобы построить его?
Это не вина IList<Partners>
. Отказ Есть другой параметр Priority
. Priority
Сама держит Measure
, Measure
проводит IList<Indicator>
и звонки Guard.AgainstEmpty(indicators)
в конструкторе.
Так что это выглядит что-то подобное:
fixture.CreateAnonymous<Foo>(); //kaboom!
public class Foo{
public Foo(IList<Bar> bars){
Guard.AgainstEmpty(bars); //just checks count for ienumerable & throws if 0
Bars=bars;
}
public IList<Bar> Bars {get;private set;} //should be readonly collection...
}
public class Fizz{
public Fizz(Foo foo){
Foo=foo;
}
public Foo{get;private set;}
}
public class Bar{}
Строительство не удалось Guard.AgainstEmpty
метод. Итак, вопрос становится - как убедиться, что Autofixture наполняет несколько баров в коллекции баров перед построением FOOS?
Решение
Это помогает. Browsing источник часто помогает.
var indicators=_f.CreateMany<Indicator>();
_f.Register<IList<Indicator>>(()=>indicators.ToList());
Хотя может быть лучший путь.
В целом, вот как это выглядит на данный момент:
_f=new Fixture().Customize(new AutoMoqCustomization());
var indicators=_f.CreateMany<Indicator>();
_f.Register<IList<Indicator>>(()=>indicators.ToList());
var regionName=_f.CreateAnonymous<string>();
_f.Register<string,Country,bool,Region>((name,country,call)=>
new Region(regionName,_f.CreateAnonymous<Country>(),true));
_c.Set(x=>x.Regions,_f.CreateMany<Region>().ToList());
_f.Register<IList<ManagementBoardEntry>>(()=>
_f.CreateMany<ManagementBoardEntry>().ToList());
_f.Register<IList<FinancialInfoEntry>>(()=>
_f.CreateMany<FinancialInfoEntry>().ToList());
_f.Register<IList<Partner>>(()=>_f.CreateMany<Partner>().ToList());
_p=_f.CreateAnonymous<Project>();
Не могу назвать это красивым (любые предложения рефакторинга приветствуются), но это все еще намного лучше, чем писать все вручную.
С использованием IList
Наверняка неверный выбор. Еще хуже - я использую IList
для недвижимости тоже. Это приглашает клиента использовать их напрямую, а не проходить через совокупный корню.
При использовании одного недостатка params
. Отказ Не может использовать более одного (если я снова не пропустил некоторые основы). И я получаю список в качестве ввода (часть листа Excel DOM), не может знать время компиляции, сколько элементов будет там.
Модель действительно свежая. Просто запеченную (так есть большой шанс, что я ошибаюсь в этих проверках пустоты, поговорим с клиентом и бизнес-аналитиком об этом).
Моя стратегия - это свободно скульптуру и толкать ее к желаемому состоянию с помощью модульных тестов. Это актуальная причина, по которой мне немного не нравится строгий TDD. Он ворует сосредоточиться, заставляет меня думать о деталях вместо целой картины слишком рано. Я предпочитаю набираться и уточнить, пока не выглядит хорошо. Но это может быть, потому что я недостаточно свободно с тестированием.
Во всяком случае - спасибо за отличные советы. Я буду продолжать узнать больше о Autofixture.