2016-04-01 4 views
3

Я пишу некоторые тесты единицы и есть класс с именем Account, который имеетAutoFixture, создать список адресов электронной почты

public Guid AccountId {get;set;} 
public IEnumerable<string> EmailAddresses {get;set;} 
etc... 

Я хочу использовать autofixture для создания учетной записи, но у меня возникают проблемы при получении формат электронной почты.

Я попытался

fixture.Register<string>(() => string.Format("{0}@acme.com", fixture.Create<string>())); 

но это приводит к круговой задаче.

я мог бы сделать это

fixture.Register<string>(() => string.Format("{0}@acme.com", fixture.Create<int>())); 

Но я предпочел бы иметь строку в начале адреса.

EDIT Благодаря обоего ответов я Письменные до резюме и несколько других сценариев, как пост здесь - http://nodogmablog.bryanhogan.net/2016/04/customizing-a-specific-string-inside-a-class-using-autofixture/

ответ

7

Есть несколько способов сделать это. Вот один из них:

Предполагая, что MyClass определяется как

public class MyClass 
{ 
    public Guid AccountId { get; set; } 
    public IEnumerable<string> EmailAddresses { get; set; } 
} 

Затем Fixture объект может быть настроен как так

var fixture = new Fixture(); 
fixture.Customize<MyClass>(c => c 
    .With(x => 
     x.EmailAddresses, 
     fixture.CreateMany<MailAddress>().Select(x => x.ToString()))); 

var result = fixture.Create<MyClass>(); 

И так EmailAddresses будет заполнена с электронной почтой строки, выглядят так:

"[email protected]" 
"[email protected]" 
"[email protected]" 
+0

вы не хотите 'Select (х => x.Address)'? ToString по адресу электронной почты приводит к '" ecfd3086-48c7-4999-8b5e-c19f9d0875ff "<[email protected]>' –

3

Это один из в тех ситуациях, когда AutoFixture дает вам обратную связь об удобстве использования вашей объектной модели.

Если свойство EmailAddresses должно содержать только действительные адреса электронной почты, тогда вы должны спросить себя, является ли представление их как общих строк: the right choice. Более конкретный тип, например класс MailAddress, ограничил бы набор допустимых значений этого свойства. Это также облегчило бы создание тестовых данных для него, поскольку AutoFixture знает, как создавать экземпляры MailAddress.

Сказав, что, если это не представляется возможным для вас, чтобы изменить модель объекта, вы все еще можете написать customization, который говорит AutoFixture предоставить действительные адреса электронной почты для любого свойства или параметра типа IEnumerable<string> с email где-то в их названии:

public class EmailAddressStringsGenerator : ISpecimenBuilder 
{ 
    public object Create(object request, ISpecimenContext context) 
    { 
     if (IsEnumerableOfStringPropertyOrParameterNamedEmail(request)) 
     { 
      return CreateManyEmailAddresses(context); 
     } 

     return new NoSpecimen(); 
    } 

    static bool IsEnumerableOfStringPropertyOrParameterNamedEmail(object request) 
    { 
     return IsEnumerableOfStringPropertyNamedEmail(request) || 
       IsEnumerableOfStringParameterNamedEmail(request); 
    } 

    static bool IsEnumerableOfStringPropertyNamedEmail(object request) 
    { 
     var property = request as PropertyInfo; 
     return property != null && 
       property.Name.ContainsIgnoringCase("email") && 
       typeof(IEnumerable<string>).IsAssignableFrom(property.PropertyType); 
    } 

    static bool IsEnumerableOfStringParameterNamedEmail(object request) 
    { 
     var parameter = request as ParameterInfo; 
     return parameter != null && 
       parameter.Name.ContainsIgnoringCase("email") && 
       typeof(IEnumerable<string>).IsAssignableFrom(parameter.ParameterType); 
    } 

    static IEnumerable<string> CreateManyEmailAddresses(ISpecimenContext context) 
    { 
     var addresses = (IEnumerable<MailAddress>) 
      context.Resolve(typeof(IEnumerable<MailAddress>)); 
     return addresses.Select(a => a.Address); 
    } 
} 

вы можете использовать эту настройку в Fixture, добавив его в Customizations собственности:

fixture.Customizations.Insert(0, new EmailAddressStringsGenerator()); 
Смежные вопросы