2015-03-18 4 views
0

Мне нужно проверить метод, который вычисляет разницу во времени по местному времени и UTC. Поэтому я попытался использовать прокладки, чтобы изменить местное время и UTC, но это не работает. Вот мой блок кода тест:Использование прокладки .NET для модульного тестирования метода datetime

<TestMethod()> Public Sub CurrentTimeTest() 

    'Arrange 
    Dim expected As System.DateTime 
    expected = New DateTime(2015, 3, 5, 20, 0, 0) 
    Dim actual As DateTime 
    actual = DateTime.Now 
    'Act 
    Using (ShimsContext.Create()) 
     System.Fakes.ShimDateTime.NowGet = Function() As System.DateTime 
               Return New DateTime(2015, 3, 5, 20, 0, 0) 
              End Function 

     System.Fakes.ShimDateTime.UtcNowGet = Function() As System.DateTime 
               Return New DateTime(2015, 3, 5, 15, 0, 0) 
              End Function 
    End Using 

    'Assert 
    Assert.AreEqual(expected, actual) 
End Sub 

Я не могу понять, почему DateTime.Now не равно, что я установил. Любая помощь будет оценена по достоинству. Заранее спасибо.

+0

Лучшим решением (IMO) было бы создание интерфейса для «чего-то, что дает вам текущее время» (возможно, только UTC) и впрыснуть туда, где вам это нужно ... тогда вы можете иметь «производственную» реализацию и «тест». Это то, что мы делаем для Noda Time ... Я использовал его в нескольких сценариях, и это намного более чистое ИМО. –

ответ

1

Вы звоните DateTime.Nowперед вы создали подкладку ... поэтому он не может, возможно, задним числом изменить значение actual. Я подозреваю, что вы используете:

Dim actual As DateTime 
'Act 
Using (ShimsContext.Create()) 
    System.Fakes.ShimDateTime.NowGet = Function() As System.DateTime 
      Return New DateTime(2015, 3, 5, 20, 0, 0) 
     End Function 

    System.Fakes.ShimDateTime.UtcNowGet = Function() As System.DateTime 
      Return New DateTime(2015, 3, 5, 15, 0, 0) 
     End Function 
    actual = DateTime.Now 
End Using 

'Assert 
Assert.AreEqual(expected, actual) 

... тогда это сработает. Но, как отмечено в комментарии, лично я бы рассматривал «Мне нужно текущее время» в качестве зависимости и представляю его в интерфейсе (IClock). Тогда вы можете иметь различные реализации для производства и тестирования (или использовать mocks, если вы действительно хотите) так же, как и для любой другой зависимости.

+0

Да, сейчас он работает. Спасибо. Я знаю, что лучше использовать интерфейсы, но я не тот, кто пишет код, и мне не разрешено изменять его. – Rany

+0

@ Rany: Ну, конечно, вы могли бы хотя бы предложить его им ... –

+0

У вас есть идея, может ли функция ToUniversalTime() скрывать DateTime.Now и DateTime.UtcNow таким образом, когда я пытаюсь их изменить, изменения не применяются, как показано выше? Заранее спасибо. – Rany