2017-01-13 289 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

请接受我的道歉;在我写这个评论之前,我没有完全阅读代码。 –