2017-01-13 1 views
3

Ich versuche, bestimmte Aufzählungswerte wie Unknown und Uninitialized aus der Menge der Werte für beliebigen Aufzählungstyp auszuschließen.Wie bestimmte Aufzählungen von allen Aufzählungstypen ausgeschlossen werden

kann ich sehen, dass Enums in einem Round-Robin-Weise erzeugt werden für einen bestimmten Typ Enum die EnumGenerator aus der Menge aller möglichen Enum Werten.

Basierend auf diesem Code, mein erster Gedanke ist es, ein ISpecimenBuilder, die für Type.IsEnum und macht einen context.Resolve(request) bis Resolve liefert einen Wert, der nicht auf der Ausschlussliste überprüft zu bauen ist.

Das Problem ist, das gibt mir einen Rekursionsfehler. Nach der Überprüfung des Quellcodes verstehe ich, warum - wenn ein Builder eine Anfrage bearbeitet und erneut eine Resolve mit derselben Anfrage aufruft, landen Sie in einer Endlosschleife.

Aber als EnumGenerator ist nicht erweiterbar, und ich kann nicht herausfinden, wie man die Build-Kette abzufangen Ich bin ratlos, wie man das löst.

Antwort

2

Sie können eine benutzerdefinierte Specimen Builder erstellen, die die vorhandene EnumGenerator verwendet, aber die Werte überspringt, die Sie nicht benötigen. In dieser Probe verwende ich die specimen.ToString() Methode absichtlich, um einen bestimmten Typ enum verknüpft werden nicht:

public class ExcludeUnknownEnumGenerator : ISpecimenBuilder 
{ 
    private readonly EnumGenerator _enumGenerator = new EnumGenerator(); 

    public object Create(object request, ISpecimenContext context) 
    { 
     var enumType = request as Type; 
     if (enumType == null || !enumType.IsEnum) 
     { 
      return new NoSpecimen(); 
     } 

     var namesEnumerator = Enum.GetNames(enumType).GetEnumerator(); 
     while (namesEnumerator.MoveNext()) 
     { 
      var specimen = _enumGenerator.Create(request, context); 
      if (specimen.ToString() != "Unknown" && 
       specimen.ToString() != "Uninitialized") 
      { 
       return specimen; 
      } 
     } 

     throw new ObjectCreationException(
      "AutoFixture was unable to create a value for " + 
      enumType.FullName + 
      " since it is an enum containing either no values or " + 
      "ignored values only ('Unknown' and 'Uninitialized'). " + 
      "Please add at least one valid value to the enum."); 
    } 
} 

public enum EnumWithUnknown 
{ 
    Known, 
    Unknown, 
    Wellknown, 
    Uninitialized 
} 

Der folgende Code zeigt enum Werte ohne die Unknown und Uninitialized Zustände:

var fixture = new Fixture(); 
fixture.Customizations.Insert(0, new ExcludeUnknownEnumGenerator()); 

Console.Out.WriteLine("result = {0}", fixture.Create<EnumWithUnknown>()); 
Console.Out.WriteLine("result = {0}", fixture.Create<EnumWithUnknown>()); 
Console.Out.WriteLine("result = {0}", fixture.Create<EnumWithUnknown>()); 
Console.Out.WriteLine("result = {0}", fixture.Create<EnumWithUnknown>()); 

*** ConsoleOutput *** 

result = Known 
result = Wellknown 
result = Known 
result = Wellknown 
+0

Wäre das nicht ist es einfacher, den vorhandenen 'EnumGenerator' zu dekorieren? –

+0

Ich rufe die 'EnumGenerator' Klasse in der' Create' Methode auf. Wenn Sie "einfacher" sagen, meinen Sie damit, die Create-Methode irgendwie zu verkleinern? –

+0

Bitte akzeptieren Sie meine Entschuldigung; Ich habe den Code nicht gründlich genug gelesen, bevor ich diesen Kommentar geschrieben habe. –

Verwandte Themen