如何对TimeZones进行单元测试?

时间:2009-09-05 19:02:28

标签: asp.net-mvc unit-testing nunit moq

我想知道如何测试TimeZone逻辑?对我来说,我的时区内容用于过滤数据库中的数据(单元测试当然会被模拟并且未经过测试)。

但是我想测试它周围的逻辑,看看我是否给出了某些时间,它会被正确转换。

我不知道怎么做。

2 个答案:

答案 0 :(得分:7)

你的意思并不完全清楚。

您是否使用系统的当前时区?如果是这样,我建议您添加某种中间静态属性,可以仅为测试重置,以便让您在测试期间“假装”您处于不同的时区。不可否认,这意味着你必须谨慎使用该财产。

我敢说有一个Win32系统调用你可以用它来改变系统时区,但听起来有点激烈 - 很遗憾没有想到一个线程的当前时区就像文化一样:((有TimeZoneInfo.Local,但就我所见,没有可以改变的方法。)

如果您没有使用本地时区,只需确保您的API获取编写测试所需的所有信息,这样您就可以确保在特定时区处理日期和时间时,您可以获得正确答案。如果它对你有用,我可以想出一些好的角落案例来测试。特别是,有些时区每年都没有当地的午夜(夏令时停止),这可能会使某些案件搞得一团糟。

答案 1 :(得分:3)

public class ClassToTest
{
    public Func<TimeZone> TimeZoneProvider = () => TimeZone.CurrentTimeZone;

    public void MethodToTest()
    {
        var timeZone = TimeZoneProvider();
        // Do something with the time zone
    }
}

[TestMethod]
public void Test()
{
    // Arrange
    var sut = new ClassToTest();
    sut.TimeZoneProvider = () => ... // return the time zone you would like for the test

    // Act
    sut.MethodToTest();

    // Assert
    // ...
}

编辑:另一种选择是使用构造函数注入将时区传递到您的类中:

public class ClassToTest
{
    private readonly TimeZone _timeZone;
    public ClassToTest(TimeZone timeZone)
    {
        _timeZone = timeZone;
    }

    public void MethodToTest()
    {
        // Do something with _timeZone
    }
}

[TestMethod]
public void Test()
{
    // Arrange
    var timeZone = ... // return the time zone you would like for the test
    var sut = new ClassToTest(timeZone);

    // Act
    sut.MethodToTest();

    // Assert
    // ...
}