.Net单元测试UTC和本地时差



我正在尝试对以下方法进行单元测试:

Public Shared Function GetLocalTimeWithTimeDifferenceUTC(startTime As DateTime) As String
    Dim localTime As String = ""
    Dim timeUTC As DateTime = startTime.ToUniversalTime()
    Dim timeDiff As TimeSpan = startTime.Subtract(timeUTC)
    Dim sSign As String = "+"
    If timeDiff.TotalMinutes < 0 Then
        sSign = "-"
        timeDiff = timeDiff.Negate
    End If
    Dim offsetUTC As String = sSign & String.Format("{0:d2}:{1:d2}", timeDiff.Hours, timeDiff.Minutes)
    localTime = startTime.ToString("yyyy-MM-ddTHH:mm:ss") & offsetUTC
    Return localTime
End Function

它返回(例如startTime=2015,3,18,10,0,0时差加上两个小时)2015-03-18T10:00:00+02:00。

这是我的单元测试:

Public Sub GetLocalTimeWithTimeDifferenceUTC_Test()
        Dim expected As String
        Dim actual As String
        Dim param As New System.DateTime(2015, 3, 5, 10, 0, 0)
        expected = "2015-03-05T10:00:00+03:00"
        Using (ShimsContext.Create())
            System.Fakes.ShimDateTime.NowGet = Function() As System.DateTime
                                                   Return New DateTime(2015, 3, 5, 10, 0, 0)
                                               End Function
            System.Fakes.ShimDateTime.UtcNowGet = Function() As System.DateTime
                                                      Return New DateTime(2015, 3, 5, 7, 0, 0)
                                                  End Function
            actual = StringFunctions.GetLocalTimeWithTimeDifferenceUTC(param)
        End Using
        Assert.AreEqual(expected, actual)
    End Sub

我应用于DateTime.Now和DateTime.UtcNow的更改不起作用,测试失败。当我尝试使用我的真实本地时间时,它是有效的。是否可能是由函数ToUniversalTime()引起的?我应该改变一下我的方法吗?任何帮助都将不胜感激。提前谢谢。

您必须提供类似的本地和UTC DateTimeKind

Public Sub GetLocalTimeWithTimeDifferenceUTC_Test()
    Dim expected As String
    Dim actual As String
    Dim param As New System.DateTime(2015, 3, 5, 10, 0, 0)
    expected = "2015-03-05T10:00:00+03:00"
    Using (ShimsContext.Create())
        System.Fakes.ShimDateTime.NowGet = Function() As System.DateTime
                                               Return New DateTime(2015, 3, 5, 10, 0, 0, DateTimeKind.Local)
                                           End Function
        System.Fakes.ShimDateTime.UtcNowGet = Function() As System.DateTime
                                                  Return New DateTime(2015, 3, 5, 7, 0, 0, DateTimeKind.Utc)
                                              End Function
        actual = StringFunctions.GetLocalStartTime(param)
    End Using
    Assert.AreEqual(expected, actual)
End Sub

最新更新