SQL Server 集成测试验证使用自动固定装置创建的日期时间
本文关键字:装置 创建 时间 日期 集成测试 Server 验证 SQL | 更新日期: 2023-09-27 18:21:40
我正在为我的存储库创建集成测试。我使用AutoFixture
创建一个应该与NotificationRepository
一起插入的Notification
。
Notification
有一个属性Processed
这是一个DateTime
。当AutoFixture
创建日期时,它是使用非常精确的值创建的。
的精度与 .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; }
}
内置
的DateTime
值类型具有其精度,您无法更改该精度。它是由 BCL 定义的类型,因此自动固定装置无法更改其精度。如果您不能按照@marc_s在注释中的建议使用DATETIME2(3)
,则存储库实现将表现出精度损失,并且您的测试需要考虑这一点。
一种方法是添加具有内置容差因子的DateTime
值的自定义比较器。例如,您可以实现IEqualityComparer<DateTime>
.
一些断言库允许你传入自定义IEqualityComparer<T>
;例如 xUnit.net。这将使您能够编写类似以下内容的内容:
Assert.Equal(expected, actual, new TolerantDateTimeComparer());
其中TolerantDateTimeComparer
是IEqualityComparer<DateTime>
的自定义实现。