SQL Server 集成测试验证使用自动固定装置创建的日期时间

本文关键字:装置 创建 时间 日期 集成测试 Server 验证 SQL | 更新日期: 2023-09-27 18:21:40

我正在为我的存储库创建集成测试。我使用AutoFixture创建一个应该与NotificationRepository一起插入的Notification

Notification有一个属性Processed这是一个DateTime。当AutoFixture创建日期时,它是使用非常精确的值创建的。

SQL Server

的精度与 .Net 不同,因此在将日期插入 SQL Server 时有时会错过一毫秒,因此我的测试很难验证结果。我使用语义比较来检查插入的值是否正确。

如何配置 AutoFixture 以创建与 SQL Server 相同的精度的日期?

当前代码

[Test]
public void InsertShouldInsertNotification()
{
    var sut = new NotificationRepository(TestConnectionString);
    var notification = fixture.Build<Notification>().Without(x => x.Id).Create();
    sut.Insert(notification);
    var result = sut.Get(notification.Id);
    notification.AsSource().OfLikeness<Notification>().ShouldEqual(result);
}
public enum DocumentStatus
{
    New = 0,
    InSigning = 1,
    Cancelled = 2,
    Signed = 3,
    InReview = 4,
    Reviewed = 5,
    Deleted = 6,
    Rejected = 7
}
public class Notification
{
    public int Id { get; set; }
    public string DocumentId { get; set; }
    public string DocumentName { get; set; }
    public string Notes { get; set; }
    public string Metadata { get; set; }
    public DocumentStatus Status { get; set; }
    public DateTime? Processed { get; set; }
}

SQL Server 集成测试验证使用自动固定装置创建的日期时间

内置

DateTime值类型具有其精度,您无法更改该精度。它是由 BCL 定义的类型,因此自动固定装置无法更改其精度。如果您不能按照@marc_s在注释中的建议使用DATETIME2(3),则存储库实现将表现出精度损失,并且您的测试需要考虑这一点。

一种方法是添加具有内置容差因子的DateTime值的自定义比较器。例如,您可以实现IEqualityComparer<DateTime> .

一些断言库允许你传入自定义IEqualityComparer<T>;例如 xUnit.net。这将使您能够编写类似以下内容的内容:

Assert.Equal(expected, actual, new TolerantDateTimeComparer());

其中TolerantDateTimeComparerIEqualityComparer<DateTime>的自定义实现。