Итак, у меня есть объект с большим количеством свойств IEnumerable. В модульном тесте я хочу сделать что-то вроде этого:Настройка AutoFixture при создании одного объекта
var subsequentAgreement = _fixture.Build<Foo>()
.With(dto => dto.Bars,
_fixture.CreateMany<Bar>())
.Create();
И для других IEnumerable<T>
свойств я хочу Enumerable.Empty<T>()
У меня есть ISpecimenBuilder
public class EmptyEnumerableBuilder : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
object returnObject = new NoSpecimen(request);
var type = request as Type;
if (type != null && type.IsGenericType)
{
var typeArguments = type.GetGenericArguments();
if(!typeArguments.Any() || typeof(IEnumerable<>) == type.GetGenericTypeDefinition())
returnObject = Array.CreateInstance(typeArguments.Single(), 0);
}
return returnObject;
}
}
, который я добавить, как так : _fixture.Customizations.Add(new EmptyEnumerableBuilder());
И это работает просто отлично, за исключением всех других объектов, которые я создаю, теперь есть пустые перечисления.
Я ищу способ применения этого EmptyEnumerableBuilder
для одного _fixture.Build<>()
и оставить все остальное по умолчанию, но я не могу найти способ.
Я попытался с помощью ограничения типа как так:
_fixture.Customize<SubsequentAgreementLimitationsDto>(composer => new EmptyEnumerableBuilder());
Но странно все другие объекты, созданные арматуре еще пустые перечислимых
Что случилось с первым блоком кода? –
Ничего, это то, как я хочу, но нормальное поведение автопотока приведет к созданию стандартного списка из 3-х элементов в IEnumerable. и я хотел бы изменить это значение по умолчанию на Enumerable.Empty (). для этого _fixture.Build или при создании объекта типа Foo. –
LordSauron
А, я вижу. [Рассмотрите возможность создания свойств вашей коллекции только для чтения] (https://msdn.microsoft.com/en-us/library/dn169389.aspx), тогда этого не произойдет. –