【问题标题】:Is there a simple way of creating an AutoFixture customization to restrict enum values?有没有一种简单的方法来创建 AutoFixture 自定义来限制枚举值?
【发布时间】:2020-10-20 09:54:15
【问题描述】:

我想创建一个自定义项来限制 AutoFixture 提供的 enum 的值。到目前为止,我能找到的唯一示例使用命令式样式(例如 this)。

给定以下enum 定义:

public enum AnEnum
{
    A,
    B,
    C
}

我想将值限制为 AnEnum.BAnEnum.C。我尝试了以下代码的一些变体。

public class EnumCustomization : ICustomization
{
    public virtual void Customize(IFixture fixture)
    {
        fixture.Customize<AnEnum>(
            c => c.FromFactory(() => new Generator<AnEnum>(fixture).First(e => e != AnEnum.A)));
    }
}

但是,它们都不可避免地导致AutoFixture.ObjectCreationExceptionWithPath 异常。如果没有自定义 AutoFixture 将照常创建 AnEnum 的值。因此,我认为问题在于我尝试自定义,而不是其他地方的任何循环引用。

【问题讨论】:

    标签: c# enums customization autofixture


    【解决方案1】:

    OOTB,AutoFixture 使用循环策略生成枚举值。如果您多次调用fixture.Create&lt;AnEnum&gt;(),您会收到一系列值,例如ABCAB... 等。

    有一个自定义使用默认的 EnumGenerator 并忽略 C 值。它可能看起来不太理想,但确实有效:

    public class AnEnumEnumGenerator : ISpecimenBuilder
    {
        private readonly EnumGenerator _builder = new EnumGenerator();
    
        public object Create(object request, ISpecimenContext context)
        {
            var value = _builder.Create(request, context);
            if (value is AnEnum @enum && @enum == AnEnum.C)
            {
                return _builder.Create(request, context);
            }
    
            return value;
        }
    }
    

    现在应用自定义并检查结果:

    fixture.Customize<AnEnum>(c => new AnEnumEnumGenerator());
    
    Console.Out.WriteLine("result = {0}", fixture.Create<AnEnum>());
    Console.Out.WriteLine("result = {0}", fixture.Create<AnEnum>());
    Console.Out.WriteLine("result = {0}", fixture.Create<AnEnum>());
    Console.Out.WriteLine("result = {0}", fixture.Create<AnEnum>());
    

    输出:

    result = A
    result = B
    result = A
    result = B
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-16
      • 2020-10-18
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多