2017-01-13 288 views
3

我想從的任何枚舉類型的值的集合中排除某些枚舉值,如UnknownUninitialized如何從所有枚舉類型中排除某些枚舉

我可以看到,Enums在循環方式使用EnumGenerator從用於給定類型Enum該組所有可能的Enum值的生成。

基礎上的代碼,我首先想到的是要建立一個ISpecimenBuilder來檢查Type.IsEnum和做了context.Resolve(request)直到Resolve返回的值是不排除列表上。

問題是這給了我一個遞歸錯誤。在檢查完源代碼之後,我明白了爲什麼 - 如果構建器處理請求並使用相同請求再次調用另一個Resolve,則會以無限循環結束。

但是因爲EnumGenerator是不可擴展的,我無法弄清楚如何攔截構建鏈,我很難理解如何解決這個問題。

回答

2

您可以創建使用現有EnumGenerator的自定義Specimen Builder,但會跳過您不需要的值。

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 
} 

下面的代碼顯示enum值而不UnknownUninitialized狀態:在這種標本我爲了不鏈接到任何特定類型enum有意使用specimen.ToString()方法

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

豈不裝飾現有的'EnumGenerator'會更容易嗎? –

+0

我在'Create'方法中調用'EnumGenerator'類。當你說'更容易'時,你的意思是縮小Create方法嗎? –

+0

請接受我的道歉;在我寫這個評論之前,我沒有完全閱讀代碼。 –