如何解决有没有简单的方法可以创建AutoFixture自定义项来限制枚举值?
我想创建一个自定义项来限制AutoFixture提供的enum
的值。到目前为止,我能够找到的唯一示例都使用命令式样式(例如this)。
给出以下enum
定义:
public enum AnEnum
{
A,B,C
}
我想将值限制为AnEnum.B
和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
的值。因此,我认为问题在于我尝试进行定制,而不是其他地方的任何循环引用。
解决方法
OOTB,AutoFixture使用循环策略生成枚举值。如果多次调用fixture.Create<AnEnum>()
,则会收到一系列值,例如A
,B
,C
,A
,B
{{ 1}}等。
有一个使用默认...
且仅忽略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>());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。