2016-04-01 5 views
3

Ich habe einige Unit-Tests zu schreiben und haben eine Klasse namens Account dieAutoFixture, erstellen Sie eine Liste von E-Mail-Adressen

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

ich autofixture verwenden möchten hat das Konto zu erstellen, aber ich habe Probleme bekommen das E-Mail-Format.

Ich habe

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

aber das führt zu Kreis Problem.

Ich kann diesen

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

tun, aber ich würde eher am Anfang der Adresse einen String hat.

EDIT Dank beiden Antworten, die ich habe eine eine Zusammenfassung und einige andere Szenarien als Beitrag hier geschrieben - http://nodogmablog.bryanhogan.net/2016/04/customizing-a-specific-string-inside-a-class-using-autofixture/

Antwort

7

Es gibt ein paar Möglichkeiten, das zu tun. Hier ist einer von ihnen:

Unter der Annahme, dass MyClass als

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

Dann wird ein Fixture Objekt kann wie so angepasst werden

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>(); 

Und so ist die EmailAddresses wird mit E-Mail-Strings gefüllt werden, dass aussehen wie:

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

Sie nicht 'wählen wollen (x => x.Address)'? ToString an einer Mail-Adresse führt zu "ecfd3086-48c7-4999-8b5e-c19f9d0875ff" <[email protected]> ' –

3

Dies ist einer von Diese Situationen, in denen AutoFixture Ihnen Rückmeldung auf die Benutzerfreundlichkeit Ihres Objektmodells gibt.

Wenn die EmailAddresses-Eigenschaft nur gültige E-Mail-Adressen enthalten soll, sollten Sie sich fragen, ob sie als generische Zeichenfolgen the right choice darstellen. Ein spezifischerer Typ wie die MailAddress-Klasse würde den Satz gültiger Werte für diese Eigenschaft einschränken. Es würde es auch einfacher machen, Testdaten dafür zu generieren, da AutoFixture weiß, wie Instanzen von MailAddress erstellt werden.

gesagt hat, dass, wenn es nicht möglich ist für Sie das Objektmodell zu ändern, können Sie immer noch ein customization schreiben, die AutoFixture gültige E-Mail-Adressen für jede Eigenschaft oder Parameter vom Typ IEnumerable<string> mit email irgendwo in ihrem Namen zu schaffen, sagt:

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); 
    } 
} 

Sie können dann diese Anpassung in einem Fixture verwenden, indem es auf die Customizations Eigenschaft hinzu:

fixture.Customizations.Insert(0, new EmailAddressStringsGenerator());