使用.NET填充程序来单元测试datetime方法

时间:2015-03-18 16:05:41

标签: vb.net unit-testing datetime

我必须测试一种计算本地时间和UTC时差的方法。所以我尝试使用填充程序来更改本地时间和UTC,但这不起作用。这是我的单元测试代码:

<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不等于我设置的那个。 任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分: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)

......然后它就会起作用。但正如评论中所指出的,我个人会对待#34;我需要当前时间&#34;作为依赖项,并在接口(IClock)中表示它。然后,您可以使用不同的生产和测试实现(或者如果您真的需要使用模拟),就像您对任何其他依赖项一样。