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
比较 expectedDateTimeUtcNow
与 actualDateTimeUtcNow
时报价不同
我正在为 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
比较 expectedDateTimeUtcNow
与 actualDateTimeUtcNow