使用Autofixture创建对象时能否指定单个枚举构造参数?
解决Autofixture生成对象时指定枚举参数的问题
当然可以指定构造函数使用的枚举值,下面是几种实用的实现方式:
方法一:用Build API直接指定(单次生效)
如果只是临时生成某个符合要求的MyObject,直接通过Build链式调用明确指定枚举值即可。
- 如果枚举是对象的属性:
var allowedEnum = YourEnum.AllowedValue; var myObject = _fixture.Build<MyObject>() .With(obj => obj.EnumProperty, allowedEnum) .Create();
- 如果枚举是构造函数的参数(而非属性),可以直接指定参数名称:
var myObject = _fixture.Build<MyObject>() .With("enumParamName", YourEnum.AllowedValue) .Create();
方法二:全局自定义枚举生成规则
如果这个枚举在多个场景下都需要使用允许的值,可以给Fixture添加自定义规则,全局生效:
public class AllowedEnumSpecimenBuilder : ISpecimenBuilder { public object Create(object request, ISpecimenContext context) { var enumType = request as Type; if (enumType == typeof(YourEnum) && enumType.IsEnum) { return YourEnum.AllowedValue; } // 非目标枚举类型交给默认逻辑处理 return new NoSpecimen(); } }
注册到Fixture后,后续所有生成操作都会自动使用允许的枚举值:
_fixture.Customizations.Add(new AllowedEnumSpecimenBuilder()); var myObject = _fixture.Create<MyObject>();
方法三:针对MyObject类型做持久化配置
如果只需要针对MyObject类型固定枚举参数,可以用Customize做一次配置,后续生成该类型对象时都会自动应用:
_fixture.Customize<MyObject>(cfg => cfg .With(obj => obj.EnumProperty, YourEnum.AllowedValue)); // 后续生成的MyObject都会使用指定的枚举值 var obj1 = _fixture.Create<MyObject>(); var obj2 = _fixture.Create<MyObject>();
内容的提问来源于stack exchange,提问作者Reubeniv
相关产品推荐
相关产品推荐

