我正在开发一个点网核心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);
}
}
}
答案 0 :(得分:1)
我已在输出标识符功能中对其进行了修复(感谢Panagiotis Kanavos,请参见注释)。不需要CurrentCultureScope。
var currentTimeUtc = _systemClockService.UtcNow;
var nlZone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
var localTime = TimeZoneInfo.ConvertTime(currentTimeUtc, nlZone);