Autofixture: рдЕрдиреБрдХреВрд▓рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирдореВрдирд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдЬрдире░ 2018  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: AutoFixture/AutoFixture

рдирдорд╕реНрддреЗ, рдореИрдВ ICustomization рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ISpecimenBuilder.CreateMany ICustomization рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ AutoFixture рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред

```рд╕реА#
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ рдлреВ рдЕрдиреБрдХреВрд▓рди: рдЖрдИрд╕реА рдЕрдиреБрдХреВрд▓рди
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╢реВрдиреНрдп рдЕрдиреБрдХреВрд▓рд┐рдд (IFixture рд╕реНрдерд┐рд░рддрд╛)
{
рд╡рд░ рдирдореВрдирд╛ = рд╕реНрдерд┐рд░рддрд╛ред рдмрд┐рд▓реНрдб()
.OmitAutoProperties()
.рд╕рд╛рде (x => x.CreationDate, DateTime.Now)
.with(x => x.Identifier, Guid.NewGuid().ToString().Substring(0, 6)) // рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
.рд╕рд╛рде(x => x.Mail, $"[email protected]")
редрдмрдирд╛рдПрдВ();

        fixture.Register(() => specimen);
}

}
```

рдкреБрдирд╢реНрдЪ: рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП With() рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рд╣реИ?

рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ @ploeh рд╕реЗ https://github.com/AutoFixture/AutoFixture/issues/361#issuecomment -86873060 рдЬреЛ рдореИрдВ рдвреВрдВрдв рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХрдИ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ Create<List<Foo>>() рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ CreateMany<Foo> рд╕реЗ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдП рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╣рд░рд╛ рджреЗрддрд╛ рд╣реИ; рдЬреЛ рдПрдХ рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рдЖрдХрд╛рд░ рдХреА рд╕реВрдЪреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛> (?) рдПрдХ рдФрд░ рдХрдореА рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рджреЛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ; рдПрдХ рдХрд╕реНрдЯрдо рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рдПрдХрд▓ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Create<T> рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВред

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

рдпрд╣ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдкреНрд░рд╢реНрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреЗ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫрдиреЗ рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╢реНрди рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдЙрддреНрддрд░ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рднреА рд▓рд╛рдн рдкрд╣реБрдВрдЪрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЧрд┐рдЯрд╣рдм рдореБрджреНрджреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдкрд░ рдкреНрд░рд╢реНрди рдФрд░ рдЙрддреНрддрд░ рдвреВрдВрдврдирд╛ рдЖрд╕рд╛рди рд╣реИред рдПрдХ рдХреЗ рд▓рд┐рдП, Google рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░реИрдВрдХ (рдмрдВрдж) рдЧрд┐рдЯрд╣рдм рдореБрджреНрджреЛрдВ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ ...

@ploeh рдореИрдВ
рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ SO рдкреНрд░рд╢реНрди рдмрдирд╛рдпрд╛ рд╣реИред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд▓рд┐рдП

@ploeh SO рдкрд░ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж: рдмреНрд▓рд╢:

@thiagomajesk рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЬрд┐рд╕ рдХрд╛рд░рдг рд╕реЗ рдорд╛рд░реНрдХ рдиреЗ SO рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рд╡рд╣ рд╡рд╣ рдЦреЛрдЬ рдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рд╡рд╣ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдорд╛рд░реНрдХ рдПрд╕рдУ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рд╡рд╣рд╛рдВ рдХреЛрдИ рдкреНрд░рд╢реНрди рдкреЛрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ (рдЬреИрд╕реЗ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рд░ рдорд┐рд▓рд╛): рдкрд╕реАрдирд╛_рд╕реНрдорд╛рдЗрд▓:

@zvirja рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХрд┐

@zvirja рдореИрдВ SO рдкрд░ @ploeh рдХреЗ рд╢рд╛рдирджрд╛рд░ рдЙрддреНрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рд╢реНрди рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред
рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдорд╛рдВрдЧрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рд╕реЗ рдФрд░ рднреА рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдкреВрдЫрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:

```рд╕реА#
рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ UniqueShortGuidBuilder: рдЖрдИрд╕реНрдкреЗрд╕рд┐рдореЗрдирдмрд┐рд▓реНрдбрд░
{
рдирд┐рдЬреА рд░реАрдбреЛрдирд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░реЛрдкрдирд╛рдо;
рдирд┐рдЬреА рд░реАрдбреЛрдирд▓реА рдЗрдВрдЯ рд▓реЗрдВрде;

public UniqueShortGuidBuilder(Expression<Func<TEntity, string>> expr, int lenght)
{
    propName = ((MemberExpression)expr.Body).Member.Name;
    this.lenght = lenght;
}

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд╕реНрддреБ рдмрдирд╛рдПрдБ (рд╡рд╕реНрддреБ рдЕрдиреБрд░реЛрдз, ISpecimenContext рд╕рдВрджрд░реНрдн)
{
var pi = PropertyInfo рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ;

if (pi == null || pi.PropertyType != typeof(string) || pi.Name != propName)
    return new NoSpecimen();

return Guid.NewGuid().ToString().Substring(0, lenght);

}
```

рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ AutoFixture рдХреЗ рд╕рд╛рде рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, ISpecimenBuilder.Create рдХреЛ рдХрдИ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдореЗрд░реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧрд╛рдЗрдб рдмрдиреЗрдВрдЧреЗ; рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣реА рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЕрднреА рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╛рдВрдЫрд┐рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

```рд╕реА#
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ рдлреВ
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ {рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ; рд╕реЗрдЯ; }
}

рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ UniqueShortGuidBuilder: рдЖрдИрд╕реНрдкреЗрд╕рд┐рдореЗрдирдмрд┐рд▓реНрдбрд░
{
рдирд┐рдЬреА рд░реАрдбреЛрдирд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░реЛрдкрдирд╛рдо;
рдирд┐рдЬреА рд░реАрдбреЛрдирд▓реА рдЗрдВрдЯ рд▓реЗрдВрде;

public UniqueShortGuidBuilder(Expression<Func<TEntity, string>> expr, int lenght)
{
    propName = ((MemberExpression) expr.Body).Member.Name;
    this.lenght = lenght;
}

public object Create(object request, ISpecimenContext context)
{
    var pi = request as PropertyInfo;

    if (pi == null || pi.PropertyType != typeof(string) || pi.Name != propName)
        return new NoSpecimen();

    return Guid.NewGuid().ToString().Substring(0, lenght);
}

}

[рддрдереНрдп]
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╢реВрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдХреВрд▓рди ()
{
рд╡рд░ рд╕реНрдерд┐рд░рддрд╛ = рдирдИ рд╕реНрдерд┐рд░рддрд╛ ();
рд╕реНрдерд┐рд░рддрд╛ред рдЕрдиреБрдХреВрд▓рдиред рдЬреЛрдбрд╝реЗрдВ (рдирдпрд╛ UniqueShortGuidBuilder .)(x => x.PropertyToCustomize, 5));

var manyFoos = fixture.CreateMany<Foo>(10);

var uniqueIds = manyFoos
    .Select(x => x.PropertyToCustomize)
    .Where(x => x.Length == 5)
    .Distinct()
    .ToArray();
Assert.Equal(10, uniqueIds.Length);

}
```

рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЖрдкрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрдВрддрд░ рдХреНрдпреЛрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ

@zvirja рдпрд╣ рдЕрдЬреАрдм рд╣реИред рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдиреНрдпреВрдирддрдо рд░реЗрдкреЛ рдХреЛрдб рд╣реИред
рдЕрдЧрд░ рдореИрдВ Fixture.Customize(new FooCustomization()); рдХреЛ рд╣рдЯрд╛

```рд╕реА#
рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛;
Microsoft.VisualStudio.TestTools.UnitTesting рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛;
AutoFixture.Kernel рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛;
System.Linq.Expressions рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛;
рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдкреНрд░рддрд┐рдмрд┐рдВрдм;
рдСрдЯреЛрдлрд┐рдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛;
System.Linq рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛;

рдиреЗрдорд╕реНрдкреЗрд╕ рдпреВрдирд┐рдЯрдЯреЗрд╕реНрдЯрдкреНрд░реЛрдЬреЗрдХреНрдЯ1
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ рдлреВ
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ {рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ; рд╕реЗрдЯ; }
}

public class FooCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        var specimen = fixture.Build<Foo>()
            .OmitAutoProperties()
            .With(x => x.PropertyToCustomize)
            .Create();

        fixture.Register(() => specimen);
    }
}

public class UniqueShortGuidBuilder<TEntity> : ISpecimenBuilder
{
    private readonly string propName;
    private readonly int lenght;

    public UniqueShortGuidBuilder(Expression<Func<TEntity, string>> expr, int lenght)
    {
        propName = ((MemberExpression)expr.Body).Member.Name;
        this.lenght = lenght;
    }

    public object Create(object request, ISpecimenContext context)
    {
        var pi = request as PropertyInfo;

        if (pi == null || pi.PropertyType != typeof(string) || pi.Name != propName)
            return new NoSpecimen();

        return Guid.NewGuid().ToString().Substring(0, lenght);
    }
}

[TestClass]
public class UnitTest1
{
    public static Fixture Fixture { get; private set; }

    [ClassInitialize]
    public static void ClassInitialize(TestContext context)
    {
        Fixture = new Fixture();
        Fixture.Customizations.Add(new UniqueShortGuidBuilder<Foo>(x => x.PropertyToCustomize, 5));
        Fixture.Customize(new FooCustomization());
    }

    [TestMethod]
    public void TestMethod1()
    {
        var manyFoos = Fixture.CreateMany<Foo>(10);

        var uniqueIds = manyFoos
            .Select(x => x.PropertyToCustomize)
            .Where(x => x.Length == 5)
            .Distinct()
            .ToArray();

        Assert.AreEqual(10, uniqueIds.Length);
    }
}

}
```

рдЕрдиреБрд╢рдВрд╕рд╛: рдпрджрд┐ рдЖрдк GUID рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ _n_ рд╡рд░реНрдг рдирд┐рдХрд╛рд▓рдиреЗ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рди рджреЗрдВ UniqueShortGuidBuilder ред рд▓рдВрдмрд╛рдИ 5 рд╣реЛрдиреЗ рдкрд░ рдорд╛рди рдХрд╛рдлреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕реЗ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЯрдХрд░рд╛рд╡ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ, рд╕рд╛рде рд╣реА рдЧреИрд░-рдЧрд╛рд░рдВрдЯреАрдХреГрдд рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ AutoFixture рд╕реЗ 0 рдФрд░ 99,999 рдХреЗ рдмреАрдЪ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗрдВ, рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓ рджреЗрдВ? IIRC, рд╕рдВрдЦреНрдпрд╛рдПрдБ рддрдм рддрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрддреА рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреАред

рдЕрдЧрд░ рдореИрдВ рдлрд┐рдХреНрд╕реНрдЪрд░ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВред рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ (рдирдпрд╛ FooCustomization ()); рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рд╣реЛрдЧреА, рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВред

рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдпрджрд┐ рдЖрдк рд╕реНрдерд┐рддрд┐ рдХреА рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХреГрдкрдпрд╛ рдореЗрд░рд╛ рдЙрддреНрддрд░ #962 рдореЗрдВ рджреЗрдЦреЗрдВред FooCustomization рдХрд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди Foo рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╣рдореЗрд╢рд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдк рдмрд╛рдж рдореЗрдВ Foo рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рд░ рдмрд╛рд░ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЖрдЧреЗ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рд░ рдмрд╛рд░ Foo рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдкрд░ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рддреЛ Customize<> API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╕реБрдЭрд╛рдпрд╛

@ploeh рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рд╡рд╣ рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд╕рдХрд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЧрд╛рдЗрдб рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд╛рдИ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд░реВрдк рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реЛрдЧреА ред

рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ, рд╕рд╛рде рд╣реА рдЧреИрд░-рдЧрд╛рд░рдВрдЯреАрдХреГрдд рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ AutoFixture рд╕реЗ 0 рдФрд░ 99,999 рдХреЗ рдмреАрдЪ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗрдВ, рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓ рджреЗрдВ?

рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрд▓реНрдлрд╛рдиреНрдпреВрдореЗрд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рдкрд╛рд╕ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЬреБрдбрд╝реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рддреНрдпрд╛рдкрди рд╣реИрдВред

рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдпрджрд┐ рдЖрдк рд╕реНрдерд┐рддрд┐ рдХреА рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ

@zvirja # 962 рдореЗрдВ рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЗ рдмрд╛рдж рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдСрдЯреЛрдлрд┐рдХреНрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧреНрд░рд┐рдо (рд╕реНрдкрд╖реНрдЯ) рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛) ред

рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдзреИрд░реНрдп рдФрд░ рд╕рднреА рдЙрддреНрдХреГрд╖реНрдЯ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдк рджреЛрдиреЛрдВ рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред
рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рднреА рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ ред

рдареАрдХ рд╣реИ, рдХрд╛рдлреА рд╣рдж рддрдХ, рдореЗрд░реЗ рдкрд╛рд╕ рдЪреАрдЬреЛрдВ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢рд╛рдмреНрджрд┐рдХ рд▓реЗрдиреЗ рдХреА рдкреНрд░рд╡реГрддреНрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ ЁЯШД

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

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

TroyHouston picture TroyHouston  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mjfreelancing picture mjfreelancing  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Ridermansb picture Ridermansb  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tomasaschan picture tomasaschan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

joelleortiz picture joelleortiz  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ