2010-09-09 2 views
3

Использование autofixture, я пытаюсь построить анонимный экземпляр Project:IList параметр <something> конструктор и AutoFixture

_f=new Fixture().Customize(new AutoMoqCustomization()); 
_p=_f.CreateAnonymous<Project>(); 

Это не удается, вызвать Project общественный конструктор требует IList<Partner>

public Project(/*.....*/,IList<Partner> partners){ 
    Guard.AgainstEmpty(partners); 
} 

трассировки стека ISN» (по крайней мере - для меня). Просто некоторое отражение yada-yada:

не удалось: System.Reflection.TargetInvocationException: Исключение было выбрано целью вызова.
---- System.ArgumentException: значение не входит в ожидаемый диапазон.
в System.RuntimeMethodHandle._InvokeConstructor (метод IRuntimeMethodInfo, Object [] арг, SignatureStruct & подпись, RuntimeType DeclaringType)

Так что - как убедиться, что autoFixture passses в анонимном сборе партнеров для того, чтобы построить его?


Это не ошибка 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?

+0

Я не могу воспроизвести эту проблему, как описано здесь. AutoMoqCustomization должен создать Mock 'IList ', поскольку это интерфейс. Тем не менее, я подозреваю, что что-то происходит внутри метода Guard.AgainstEmpty, который пытается использовать Mock в «незаконном» порядке. Можете ли вы, из трассировки стека, увидеть, где в вашем собственном коде генерируется исключение, и поделиться этим кодом? –

+0

@Mark Seemann ahhh .... похоже, это не то, на что это похоже. добавит подробности в один момент к моему вопросу. –

ответ

1

Это помогает. Просмотр source часто помогает.

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.

+0

+1 Картирование для CreateMany в настоящее время является идиоматическим способом заполнения списка, хотя вы можете сделать это в одном из следующих утверждений: '_f.Register > (() => _f.CreateMany () .ToList ()); ' –

+1

Однако см. Также: http://autofixture.codeplex.com/workitem/4199 –

+1

@Mark я сказал, что ваш инструмент спас мой день? что класс Project содержит множество объектов ценности. Бог знает, насколько глубоко. для установки действительного проекта потребуется несколько часов. –

Смежные вопросы