c# - Preventing Autofixture from filling child collections -
i'm using latest version of autofixture, , i'd prevent filling automatically child collections.
for example, have class person has list property. want properties filled, except list.
i tried using customization :
public class removemultiples : icustomization { public void customize(ifixture fixture) { fixture.customizations .oftype<filteringspecimenbuilder>() .where(x => x.specification dictionaryspecification) .tolist().foreach(c => fixture.customizations.remove(c)); fixture.customizations .oftype<filteringspecimenbuilder>() .where(x => x.specification collectionspecification) .tolist().foreach(c => fixture.customizations.remove(c)); fixture.customizations .oftype<filteringspecimenbuilder>() .where(x => x.specification hashsetspecification) .tolist().foreach(c => fixture.customizations.remove(c)); fixture.customizations .oftype<filteringspecimenbuilder>() .where(x => x.specification listspecification) .tolist().foreach(c => fixture.customizations.remove(c)); } }
but prevents me using .createmany()
.
edit: can use .createmany(3)
, works.
is there setting somewhere let me autofill collections when need to?
edit2: class person should this:
[serializable] public class person { private icollection<otherclass> _otherclasses; private string _something; public virtual icollection<otherclass> otherclasses { { return _otherclasses; } set { _otherclasses = value; } } }
note it's not collection
, ilist
note2: realized removed customization ienumerable
hence why createmany()
doesn't create anything.
here's 1 way it.
start implementing specimenbuilder tells autofixture skip assigning value collection property:
public class collectionpropertyomitter : ispecimenbuilder { public object create(object request, ispecimencontext context) { var pi = request propertyinfo; if (pi != null && pi.propertytype.isgenerictype && pi.propertytype.getgenerictypedefinition() == typeof(icollection<>)) return new omitspecimen(); return new nospecimen(request); } }
then encapsulate in customization:
public class donotfillcollectionproperties : icustomization { public void customize(ifixture fixture) { fixture.customizations.add(new collectionpropertyomitter()); } }
the following tests pass:
[fact] public void createpersonwithoutfillingcollectionproperty() { var fixture = new fixture().customize(new donotfillcollectionproperties()); var actual = fixture.create<person>(); assert.null(actual.otherclasses); } [fact] public void createmanystillworks() { var fixture = new fixture().customize(new donotfillcollectionproperties()); var actual = fixture.createmany<person>(); assert.notempty(actual); } [fact] public void creatliststillworks() { var fixture = new fixture().customize(new donotfillcollectionproperties()); var actual = fixture.create<list<person>>(); assert.notempty(actual); } [fact] public void createcollectionstillworks() { var fixture = new fixture().customize(new donotfillcollectionproperties()); var actual = fixture.create<icollection<person>>(); assert.notempty(actual); }
Comments
Post a Comment