我想知道如何测试TimeZone逻辑?对我来说,我的时区内容用于过滤数据库中的数据(单元测试当然会被模拟并且未经过测试)。
但是我想测试它周围的逻辑,看看我是否给出了某些时间,它会被正确转换。
我不知道怎么做。
答案 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
// ...
}