AutoFixture Customize vs Build
Asked Answered
C

1

10

I know I can use AutoFixture to create an auto-mocked instance using

var person = fixture.Create<Person>();

But, if I want to customise the way a Person is created I have several options. One is to use Build

var person = fixture.Build<Person>()
                    .With(x => x.FirstName, "Owain")
                    .Create();

And another is to use Customize

fixture.Customize<Person>(c => c.With(x => x.FirstName, "Owain"));
var person = fixture.Create<Person>();

So, my question is, what are the various merits and pitfalls of each approach listed above, and are there any other / better approaches?

Conakry answered 16/8, 2019 at 14:18 Comment(0)
A
6

.Build<>.With().Create() creates the instance with those properties. Future calls to .Create<>() (for the same type) are unnafected.

.Customize<> defines extra "steps" for the creation of a type. This means that all future calls to .Create<>() (for the same type) will go through the same steps.

Basically, you would use customize for cases where all created objects of a specific type require the same set-up.


var person_1 = fixture.Build<Person>()
    .With(x => x.FirstName, "Owain")
    .Create();

var person_2 = fixture.Create<Person>();

fixture.Customize<Person>(c => c.With(x => x.FirstName, "Owain"));
// All subsequent calls to Create for type Person will use the customization.

var person_3 = fixture.Create<Person>();
var person_4 = fixture.Create<Person>();

//person_1.FirstName == "Owain"
//person_2.FirstName != "Owain"
//person_3.FirstName == "Owain"
//person_4.FirstName == "Owain"

Relevant pages of the holy book:

  1. Customize: Customizing A Type's Builder With AutoFixture
  2. Build.Do.With: Do Redux
Augustin answered 16/8, 2019 at 15:16 Comment(1)
Note that from version 4 onward, Customizations are completely ignored by Build<T>.Unstop

© 2022 - 2024 — McMap. All rights reserved.