如何在xUnit测试中使用Fixture为.NET Core 5 Web API配置空/Null异常属性
解决AutoFixture设置QueryResultSummary.Exceptions为Null的问题
我之前也碰到过AutoFixture自动生成引用类型实例的类似问题,针对你的场景,有几个实用的解决方案:
1. 显式指定Null的类型
你原来的代码报错,大概率是因为编译器无法正确推断null的类型(毕竟null能匹配任意引用类型)。只需要把null显式转换成Exception类型就能解决:
public async Task APIMethodX_ShouldReturn_DoesNotExist_When_SiteNotFound() { //Arrange var fixture = new Fixture(); long startDateTimeUtc = 1626994800000; int siteId = 5588; fixture.Customize<QueryResultSummary>(c => c .With(x => x.RecordsCount, 0) .With(x => x.IsRecordExist, false) .With(x => x.Error, false) .With(x => x.ExecutionMessage, QueryExecutionStatusEnum.DoesNotExist.ToString()) .With(x => x.Exceptions, (Exception)null) // 显式指定类型 ); }
2. 使用.Do手动赋值属性
如果还是遇到问题,.Do方法可以让你直接操作生成的对象实例,手动设置属性值,这种方式更灵活:
fixture.Customize<QueryResultSummary>(c => c .With(x => x.RecordsCount, 0) .With(x => x.IsRecordExist, false) .With(x => x.Error, false) .With(x => x.ExecutionMessage, QueryExecutionStatusEnum.DoesNotExist.ToString()) .Do(summary => summary.Exceptions = null) // 直接修改实例属性 );
3. 全局配置Null注入(适合多测试场景)
如果你的多个测试都需要把Exception类型设为null,可以在Fixture初始化时全局注入null实例,这样所有需要Exception的地方都会自动返回null:
var fixture = new Fixture(); // 全局注入null的Exception fixture.Inject((Exception)null); // 后续Customize时就不用单独处理Exceptions属性了 fixture.Customize<QueryResultSummary>(c => c .With(x => x.RecordsCount, 0) .With(x => x.IsRecordExist, false) .With(x => x.Error, false) .With(x => x.ExecutionMessage, QueryExecutionStatusEnum.DoesNotExist.ToString()) );
补充说明
AutoFixture的默认行为是自动填充所有引用类型的属性,所以它会自动生成Exception的实例而不是null。你之前的代码报错,本质是因为AutoFixture默认不允许直接传入无类型的null来覆盖自动生成的属性值,通过上面几种方式就能绕过这个限制。
内容的提问来源于stack exchange,提问作者K.Z
相关产品推荐
相关产品推荐

