Вопрос

С использованием Автофиксировка, Я пытаюсь построить анонимный экземпляр 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top