我想创建一个自定义来限制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
值。因此,我认为问题出在我对定制的尝试上,而不是其他地方的循环引用。
发布于 2020-10-20 11:46:10
OOTB,AutoFixture使用循环策略来生成枚举值。如果多次调用fixture.Create<AnEnum>()
,则会收到一系列值,如A
、B
、C
、A
、B
...
等。
有一个定制,它使用默认的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
https://stackoverflow.com/questions/64442694
复制相似问题