如何在AutoFixture中创建包含一个指定自定义对象的对象列表
解决方案
下面提供几种更优雅的实现方式,均满足「仅列表首个元素为自定义值,其余元素由AutoFixture自动生成」的需求:
方式1:直接拼接集合(最直观,无额外依赖)
先生成自定义的目标对象,再拼接AutoFixture生成的剩余元素,通过CreateMany的入参控制总数量:
// 先构造自定义的首个元素 var customItem = new TestObject { Name = "best guy" }; // 总数量为10的话,剩余9个由AutoFixture自动生成 var inputValues = new[] { customItem } .Concat(AutoFixture.Build<TestObject>().CreateMany(9)) .ToList();
如果不需要对其余元素做额外的Build配置,还可以简化为:
var inputValues = new[] { new TestObject { Name = "best guy" } } .Concat(AutoFixture.CreateMany<TestObject>(9)) .ToList();
方式2:封装扩展方法(适合高频场景复用)
如果项目中经常有这类需求,可以封装AutoFixture的扩展方法简化调用:
public static class FixtureExtensions { /// <summary> /// 生成指定数量的对象集合,首个元素为自定义值,其余元素由AutoFixture自动生成 /// </summary> /// <param name="fixture">AutoFixture实例</param> /// <param name="firstItem">自定义的首个元素</param> /// <param name="totalCount">集合总数量,默认值为AutoFixture默认的3</param> /// <typeparam name="T">集合元素类型</typeparam> /// <returns>生成的对象集合</returns> public static List<T> CreateManyWithFirstCustom<T>(this IFixture fixture, T firstItem, int totalCount = 3) { if (totalCount < 1) throw new ArgumentOutOfRangeException(nameof(totalCount), "集合总数量不能小于1"); return totalCount == 1 ? new List<T> { firstItem } : new[] { firstItem }.Concat(fixture.CreateMany<T>(totalCount - 1)).ToList(); } }
扩展方法的使用示例:
// 生成总数量为10的集合,首个元素为自定义值 var inputValues = AutoFixture.CreateManyWithFirstCustom(new TestObject { Name = "best guy" }, 10);
补充说明
你之前提到的Build().With()写法语法需要调整,正确写法是传入属性表达式和对应值,该写法确实会统一设置所有生成元素的属性,仅适合全列表属性统一的场景:
// 正确的With写法,会将所有生成的TestObject的Name属性设为test var inputValues = AutoFixture.Build<TestObject>() .With(c => c.Name, "test") .CreateMany() .ToList();
内容的提问来源于stack exchange,提问作者Changer
相关产品推荐
相关产品推荐

