3

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

给定以下enum定义:

public enum AnEnum
{
    A,
    B,
    C
}

我想将值限制为AnEnum.Band AnEnum.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正常的值。因此,我认为问题在于我的定制尝试,而不是其他地方的任何循环引用。

4

1 回答 1

0

OOTB,AutoFixture 使用循环策略生成枚举值。如果您fixture.Create<AnEnum>()多次调用,您会收到一系列值,例如A, B, C,AB ...

有一个使用默认值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
于 2020-10-20T11:46:09.967 回答