xUnit,在测试中使用 DateTime UtcNow 以毫秒为单位失败

xUnit, using DateTime UtcNow in test fails the with fraction of millisecond

我正在为 DateTimeUTC 进行 .NET 5 单元测试。我的以下测试在几分之一毫秒内失败。我正在初始化 expectedDateTimeUtcNow = DateTimeOffset.UtcNow 然后使用 expectedDateTimeUtcNow 转换为毫秒作为 SUT 来测试我的方法,我传递硬编码的长毫秒值然后测试通过不确定我缺少什么

[Fact]
public void ConvertDateTimeToUTC_MustTakeDateTimeParameter_InMilliSecond()
{
        //Arrange
        long startDateTimeUtc = 1626991200000; //2021-07-22 22:00:00
        var expectedDateTime = DateTimeOffset.FromUnixTimeMilliseconds(startDateTimeUtc);

        var expectedDateTimeUtcNow = DateTimeOffset.UtcNow;
        var dateTimeUtcNowMiliSec = expectedDateTimeUtcNow.ToUnixTimeMilliseconds();

        //Act 
        DateTimeOffset utcConvertedDateTime = DateTimeCalculationHelper.ConvertDateTimeToUTC(startDateTimeUtc);
        DateTimeOffset actualDateTimeUtcNow = DateTimeCalculationHelper.ConvertDateTimeToUTC(dateTimeUtcNowMiliSec);


        //Assert
        Assert.Equal(expectedDateTime, utcConvertedDateTime);
        Assert.Equal(expectedDateTimeUtcNow, actualDateTimeUtcNow);
    }

SUT

 public static DateTimeOffset ConvertDateTimeToUTC(long utcDateTimeInMilliSec)
    {
        var dateTimeUtc = DateTimeOffset.FromUnixTimeMilliseconds(utcDateTimeInMilliSec);

        return dateTimeUtc;
    }

从根本上说,当您转换为 整数毫秒 (就像调用 ToUnixTimeMilliseconds 一样)时,您会丢失任何亚毫秒数据。这应该不足为奇。

目前,您的测试是这样的:

double original = 5.5;
int integer = (int) original;
double result = (double) integer;
Assert.Equal(original, result);

如果您理解为什么该测试注定会失败,请将同样的事情应用到您的情况中。当您转换回 DateTimeOffset...

时,您无法“重新获得”丢失的亚毫秒信息

替代但多余。测试通过。

 Assert.Equal(expectedDateTimeUtcNow.ToUnixTimeMilliseconds(), actualDateTimeUtcNow.ToUnixTimeMilliseconds()); //PASSED

比较 expectedDateTimeUtcNowactualDateTimeUtcNow

时报价不同