特定特定单位测试失败



我正在开发一个dot net core 2.2控制台应用程序,将.csv文件转换为.xml文件。

我有一个单位测试来测试特定XML文件名的创建。文件名的一部分是时间。此时间平局应该始终是当地时间。将dotnet core 2.2与xunit一起使用。

该测试在本地成功(荷兰,培养NL-NL(,但在使用宿主剂在Azure进行测试时失败。该托管代理位于美国某个地方(文化EN-US(。

为了修复此测试,我在特定文化中创建了一个特定的运行范围。我以为DateTimeOffset的.localtime为我提供了特定文化的本地时间,但是当我在VS2019中调试时,它留在NL-NL中。

为什么?

这是一些代码零件(删除了一些代码以更好地阅读(:

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);
       }
   }
}

和CurrentUlturesCope类:

public class CurrentCultureScope : IDisposable
    {
        private readonly CultureInfo _culture;
        private readonly CultureInfo _uiCulture;
        private bool _disposed = false;
        public CurrentCultureScope(string name)
        {
            _culture = Thread.CurrentThread.CurrentCulture;
            _uiCulture = Thread.CurrentThread.CurrentUICulture;
            Thread.CurrentThread.CurrentCulture = new CultureInfo(name);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(name);
        }
        public void Dispose()
        {
            Dispose(true);
        }
        protected virtual void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    Thread.CurrentThread.CurrentCulture = _culture;
                    Thread.CurrentThread.CurrentUICulture = _uiCulture;
                }
                _disposed = true;
            }
        }
    }
}

和类创建输出标识符的类:

public string GetOutputIdentifier()
        {
            var currentTimeUtc = _systemClockService.UtcNow;
            var localTime = currentTimeUtc.LocalDateTime;
            var creationDate = localTime.ToString("yyyyMMdd");
            var creationTime = localTime.ToString("HHmmss");
            // code removed
        }

我将其修复在输出标识符函数中(感谢Panagiotis Kanavos,请参阅评论(。不需要当前的文化限制。

 var currentTimeUtc = _systemClockService.UtcNow;
 var nlZone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
 var localTime = TimeZoneInfo.ConvertTime(currentTimeUtc, nlZone);

最新更新