.NET6中AutoFixture是否支持DateOnly?创建实例时抛出异常
问题解决:AutoFixture 4.17.0无法创建DateOnly实例
问题现象
使用AutoFixture 4.17.0版本时,调用fixture.Create<DateOnly>()或通过[AutoData]注入DateOnly参数会抛出以下异常:
AutoFixture.ObjectCreationExceptionWithPath : AutoFixture无法从System.DateOnly创建实例,创建意外失败。请参考内部异常排查根本原因。
但创建TimeOnly实例或其他类型(如string)可正常运行。
原因
AutoFixture 4.17.0版本未内置对.NET 6引入的DateOnly类型的支持,而TimeOnly因构造函数特性被默认创建逻辑兼容,所以可以正常生成实例。官方对DateOnly的支持从AutoFixture 4.18.0版本开始加入。
解决方案
方案1:升级AutoFixture版本
直接将AutoFixture和AutoFixture.NUnit3 NuGet包升级到4.18.0及以上版本,升级后无需额外配置即可正常创建DateOnly实例。
方案2:自定义SpecimenBuilder(不升级版本时)
如果无法升级版本,可手动添加自定义的实例创建逻辑:
- 创建DateOnly的自定义Builder:
using AutoFixture; using AutoFixture.Kernel; public class DateOnlyBuilder : ISpecimenBuilder { public object Create(object request, ISpecimenContext context) { var targetType = request as Type; if (targetType == typeof(DateOnly)) { // 生成一个介于DateOnly最小值和最大值之间的随机日期 var random = new Random(); var dayNumber = random.Next(DateOnly.MinValue.DayNumber, DateOnly.MaxValue.DayNumber); return DateOnly.FromDayNumber(dayNumber); } // 非DateOnly类型,返回NoSpecimen让其他Builder处理 return new NoSpecimen(); } }
- 注册Builder到Fixture实例
对于直接使用Fixture的场景:
[SetUp] public void Setup() { fixture.Customizations.Add(new DateOnlyBuilder()); var date = fixture.Create<DateOnly>(); // 现在可正常运行 var time = fixture.Create<TimeOnly>(); }
对于[AutoData]属性注入的场景,需要自定义AutoDataAttribute:
public class CustomAutoDataAttribute : AutoDataAttribute { public CustomAutoDataAttribute() : base(() => { var fixture = new Fixture(); fixture.Customizations.Add(new DateOnlyBuilder()); return fixture; }) { } }
然后在测试方法中使用自定义属性:
[Test, CustomAutoData] public void CreateDateOnly(DateOnly date) { } // 现在可正常运行
内容的提问来源于stack exchange,提问作者Evgeny
相关产品推荐
相关产品推荐

