2015-03-19 1 views
0

Je suis en train de test unitaire la méthode suivante:Unité .Net Test du décalage horaire UTC et locale

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 

Il retourne (par exemple startTime = 2015,3,18,10,0,0 décalage horaire est plus deux heures) 2015-03-18T10: 00: 00 + 02: 00.

Voici mon test unitaire:

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 

Les changements que j'applique à DateTime.Now et DateTime.UtcNow ne fonctionnent pas et le test échoue. Quand j'essaye avec mon vrai temps local, ça fonctionne. Est-il possible que provienne de la fonction ToUniversalTime()? Dois-je changer quelque chose dans mon approche? Toute aide serait appréciée. Merci d'avance.

+0

Vous ne l'avez pas montré tout code partout qui appelle '' DateTime.Now' ou DateTime.UtcNow'. GetLocalStartTime est-il censé faire cela? Vous n'avez pas montré ce code - seulement 'GetLocalTimeWithTimeDifferenceUTC'. En aparté, tout ceci est assez désagréable - si vous voulez une heure locale avec un décalage de UTC, c'est ce que le type 'DateTimeOffset' est pour ... –

+0

Oh, GetLocalStartTime est GetLocalTimeWithTimeDifferenceUTC, une faute de frappe, je l'ai changé maintenant . Je suppose que ToUniversalTime() utilise DateTime.Now et DateTime.UtcNow. Ai-je tort? – Rany

+0

Non, pourquoi 'ToUniversalTime' ferait-il quelque chose avec' DateTime.Now' ou 'DateTime.UtcNow'? Il est appelé sur un DateTime spécifique ... –

Répondre

-1

Vous devez fournir DateTimeKind local et UTC comme celui-ci

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 
+0

Non, ce n'est pas le problème ici. (C'est en quelque sorte un * problème *, mais votre solution n'aidera pas immédiatement l'OP.) Le problème est que le code que l'OP appelle n'utilise jamais la date/heure actuelle. –

+0

@TIKSN: Cela ne fonctionne toujours pas. – Rany