对特别常用的类注入横切关注点
-
如果代码中存在像DateTime这样的横切关注点,使用他们的地方会非常多,如果把他们实现成可注入的,产生的代码会很容易测试。
-
但是这种方法只适用于那些在系统中广泛使用的东西。
-
为了保证所有人都用这个方法,要进行代码审查
-
对于老项目,可以使用文本替换操作,来替换所有的DateTime到自己实现的SystemTime类。
具体代码如下:
public static class TimeLogger
{
public static string CreateMessage(string info)
{
//使用SystemTime类的产品代码
return SystemTime.Now.ToShortDateString() + " " + info;
}
}
public class SystemTime
{
private static DateTime _date;
//SystemTime可以修改当前时间
public static void set(DateTime custom)
{
_date = custom;
}
//也可以重置当前时间
public static void Reset()
{
_date=DateTime.MinValue;
}
//如果设置了时间,SystemTime就返回假时间,否则返回真实的时间
public static DateTime Now
{
get
{
if (_date != DateTime.MinValue)
{
return _date;
}
return DateTime.Now;
}
}
}
测试时使用的代码如下:
[TestFixture]
public class TimeLoggerTests
{
[Test]
public void SettingSystemTime_Always_ChangesTime()
{
//设置一个假日期
SystemTime.Set(new DateTime(2000,1,1));
string output = TimeLogger.CreateMessage("a");
//下面这如果用微软的方法测试就会出错,微软测试方法中这个是前面的是否包含后面的字符串。
//而使用Nunit就是虾米这种方式
StringAssert.Contains("2000/1/1", output);
}
[TearDown]
public void AfterEachTest()
{
//每次测试结束时重置日期
SystemTime.Reset();
}
}
-
这样做的好处是,不用在应用程序中注入一大堆接口,只需要在测试类中加入一个简单的[TearDown]方法,确报当前测试不会改变其他测试时间值。
-
由于culture属性会改变输出字符串格式,所以要加上一个CultureInfoAttribute属性,强制测试在一个指定的culture下运行。 原书日期格式是01.01.2000是在en-US下的,而中文的是2000/1/1,是zh-CN下的。