本地时间特定单元测试失败

时间:2019-06-26 09:28:25

标签: c# .net-core xunit.net datetimeoffset

我正在开发一个点网核心2.2控制台应用程序,以将.csv文件转换为.xml文件。

我有一个单元测试来测试特定xml文件名的创建。文件名的一部分是时间。该时间段应该始终是本地时间。 将dotnet core 2.2与xUnit一起使用。

该测试在本地成功(荷兰,文化NL-NL),但是在Azure中使用托管代理进行测试时失败。该托管代理托管在美国某个地方(美国文化)。

为修复此测试,我在特定区域性中创建了特定的运行范围。 我以为DateTimeOffset的.LocalTime给了我特定于文化的本地时间,但是当我在VS2019中调试它时,它停留在nl-NL中。

为什么?

这里有一些代码部分(为了更好的阅读,删除了一些代码):

is_active: true
category_id: [1,2,3,4]
brand: "addidas"
gender: "male"`enter code here`

以及CurrentCultureScope类:

SELECT .... WHERE 
is_active= 1 AND category_id IN(1,2,3,4) 
AND brand='addidas' AND gender='male'

以及创建输出标识符的类:

public class OutputIdentifierServiceTests
{
   [Fact(DisplayName = "Valid filename is created")]
   public void GetOutputIdentifier_ReturnsFilename()
   {
       // Arrange

       // utc time          = 16:52:33
       // local nl-NL time  = 18:52:33

       using (new CurrentCultureScope("en-US"))
       {
           var currentTimeUtc = new DateTimeOffset(2019, 6, 14, 16, 52, 33, TimeSpan.Zero);

           _systemClockServiceMock.SetupGet(s => s.UtcNow).Returns(currentTimeUtc);

           var sut = CreateSut();

           // Act
           var filename = sut.GetOutputIdentifier();

           // Assert
           Assert.Equal("20190614T165233", filename);
       }
   }
}

1 个答案:

答案 0 :(得分:1)

我已在输出标识符功能中对其进行了修复(感谢Panagiotis Kanavos,请参见注释)。不需要CurrentCultureScope。

 var currentTimeUtc = _systemClockService.UtcNow;

 var nlZone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");

 var localTime = TimeZoneInfo.ConvertTime(currentTimeUtc, nlZone);