首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有没有一种简单的方法可以创建一个AutoFixture定制来限制枚举值?

有没有一种简单的方法可以创建一个AutoFixture定制来限制枚举值?
EN

Stack Overflow用户
提问于 2020-10-20 09:54:15
回答 1查看 275关注 0票数 3

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

给定以下enum定义:

代码语言:javascript
运行
AI代码解释
复制
public enum AnEnum
{
    A,
    B,
    C
}

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

代码语言:javascript
运行
AI代码解释
复制
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值。因此,我认为问题出在我对定制的尝试上,而不是其他地方的循环引用。

EN

回答 1

Stack Overflow用户

发布于 2020-10-20 11:46:10

OOTB,AutoFixture使用循环策略来生成枚举值。如果多次调用fixture.Create<AnEnum>(),则会收到一系列值,如ABCAB ...等。

有一个定制,它使用默认的EnumGenerator并忽略C的值。它可能看起来不是最优的,但它确实做到了:

代码语言:javascript
运行
AI代码解释
复制
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;
    }
}

现在应用定制并检查结果:

代码语言:javascript
运行
AI代码解释
复制
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>());

输出:

代码语言:javascript
运行
AI代码解释
复制
result = A
result = B
result = A
result = B
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64442694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档