Autofixture: FromFactory рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рдЕрдХреНрддреВре░ 2017  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: AutoFixture/AutoFixture

рдирдорд╕реНрддреЗ,

```рд╕реА#
[рдЯреЗрд╕реНрдЯрдлрд┐рдХреНрдЪрд░]
рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рдЯреЗрд╕реНрдЯрдСрдЯреЛрдлрд┐рдХреНрдЪрд░ {

    public class TestClass
    {
        public string Property { get; set; }
    }

    [Test]
    public void Test()
    {
        var f = new Fixture();
        f.Customize<TestClass>(composer => composer.FromFactory(() => new TestClass { Property = "foobar" }));

        var o = f.Create<TestClass>();

        Assert.That(o.Property, Is.EqualTo("foobar"));
    }
}

```

рдпрд╣ рдкрд░реАрдХреНрд╖рдг .NET рдХреЛрд░ 2 рдкрд░ 4.0.0-rc1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╛ рддреЛ рднреНрд░рд╛рдордХ рд╣реИ (рдпрд╛ рдЦрд░рд╛рдм рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ) рдпрд╛ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ ред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдЯреВрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рдиреАрдЪреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рджреЗрдЦреЗрдВред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдареАрдХ рд╣реИ, рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╣рдорд╛рд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ я╕П

рдЬрдм рддрдХ рдЖрдк fixture.OmitAutoProperties = true рд╕реЗрдЯ рдХрд░рдХреЗ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдХреНрд╖рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ AutoFixture рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЧреБрдгреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИред composer.FromFactory() рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХреИрд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╛рдж рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЧреБрдг рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрдЪрд┐рдд AutoFixture API рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рд╕рдмрд╕реЗ "рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░" рдЙрдкрдпреЛрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдЧрд╛:

```рд╕реА#
рдЪ. рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ(рд╕реА => рд╕реА
.рдлреНрд░реЙрдордлреИрдХреНрдЯрд░реА (() => рдирдпрд╛ рдЯреЗрд╕реНрдЯрдХреНрд▓рд╛рд╕ ())
.with(x => x.Property, "foobar"));

or even the simplified one as AutoFixture will automatically pick up that constructor:
```c#
f.Customize<TestClass>(c => c
    .With(x => x.Property, "foobar"));

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддреЛ рдЖрдк рдмрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧреБрдг рднрд░рдиреЗ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
```рд╕реА#
рдЪ. рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ(рд╕реА => рд╕реА
.рдлреНрд░реЙрдордлреИрдХреНрдЯрд░реА (() => рдирдпрд╛ рдЯреЗрд╕реНрдЯрдХреНрд▓рд╛рд╕ {рд╕рдВрдкрддреНрддрд┐ = "рдлреВрдмрд╛рд░"})
.OmitAutoProperties ());

However, in this case, probably, the `Customize<>()` API is an overhead. Instead, it's simpler to use the `fixture.Register()` method as it allows to use the constructed instance "as-is" without any post-processing:

```c#
f.Register(() => new TestClass { Property = "foobar" });

рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рд╕рдЯреАрдХ рдПрдкреАрдЖрдИ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╣ рд╕рднреА рдПрдкреАрдЖрдИ рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдк рдмреЗрд╣рддрд░ рджрд┐рдЦрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рд╢реНрди рд╣реИрдВ рдФрд░ рдореИрдВ рдЦреБрд╢реА рд╕реЗ рдЖрдкрдХреА рдорджрдж рдХрд░реВрдВрдЧрд╛ред

рдкреАрдПрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдВрдХ рднреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдкреАрдкреАрдПрд╕ composer.Without(x => x.Property) рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдкрддреНрддрд┐/рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдСрдЯреЛ-рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддреА рд╣реИред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ AutoFixture рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд╛рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдорд╛рди рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ .Without(_ => _.Property) рдмрд╛рдж FromFactory рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рдмрдЧ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдареАрдХ рд╣реИ, рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╣рдорд╛рд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ я╕П

рдЬрдм рддрдХ рдЖрдк fixture.OmitAutoProperties = true рд╕реЗрдЯ рдХрд░рдХреЗ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдХреНрд╖рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ AutoFixture рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЧреБрдгреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИред composer.FromFactory() рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХреИрд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╛рдж рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЧреБрдг рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрдЪрд┐рдд AutoFixture API рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рд╕рдмрд╕реЗ "рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░" рдЙрдкрдпреЛрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдЧрд╛:

```рд╕реА#
рдЪ. рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ(рд╕реА => рд╕реА
.рдлреНрд░реЙрдордлреИрдХреНрдЯрд░реА (() => рдирдпрд╛ рдЯреЗрд╕реНрдЯрдХреНрд▓рд╛рд╕ ())
.with(x => x.Property, "foobar"));

or even the simplified one as AutoFixture will automatically pick up that constructor:
```c#
f.Customize<TestClass>(c => c
    .With(x => x.Property, "foobar"));

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддреЛ рдЖрдк рдмрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧреБрдг рднрд░рдиреЗ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
```рд╕реА#
рдЪ. рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ(рд╕реА => рд╕реА
.рдлреНрд░реЙрдордлреИрдХреНрдЯрд░реА (() => рдирдпрд╛ рдЯреЗрд╕реНрдЯрдХреНрд▓рд╛рд╕ {рд╕рдВрдкрддреНрддрд┐ = "рдлреВрдмрд╛рд░"})
.OmitAutoProperties ());

However, in this case, probably, the `Customize<>()` API is an overhead. Instead, it's simpler to use the `fixture.Register()` method as it allows to use the constructed instance "as-is" without any post-processing:

```c#
f.Register(() => new TestClass { Property = "foobar" });

рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рд╕рдЯреАрдХ рдПрдкреАрдЖрдИ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╣ рд╕рднреА рдПрдкреАрдЖрдИ рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдк рдмреЗрд╣рддрд░ рджрд┐рдЦрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рд╢реНрди рд╣реИрдВ рдФрд░ рдореИрдВ рдЦреБрд╢реА рд╕реЗ рдЖрдкрдХреА рдорджрдж рдХрд░реВрдВрдЧрд╛ред

рдкреАрдПрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдВрдХ рднреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдкреАрдкреАрдПрд╕ composer.Without(x => x.Property) рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдкрддреНрддрд┐/рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдСрдЯреЛ-рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддреА рд╣реИред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ AutoFixture рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд╛рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдорд╛рди рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рдЖрдк рдХрдорд╛рд▓ рд╣реЛ :)

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕