You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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(不升级版本时)

如果无法升级版本,可手动添加自定义的实例创建逻辑:

  1. 创建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();
    }
}
  1. 注册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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:15:30