在實際項目中不少地方用到DateTime.Now,這個時間是時時變化的。若是要進行單元測試對比預期結果時,這個時間沒法預測,能夠添加以下兩個時間類ide
namespace Common.Helper { /// <summary> /// 獲取當前時間 /// However, when unit testing with static state, always remember to tear down your fixture by calling . /// </summary> public abstract class TimeProvider { private static TimeProvider current = DefaultTimeProvider.Instance; public static TimeProvider Current { get { return TimeProvider.current; } set { if (value == null) { throw new ArgumentNullException("value"); } TimeProvider.current = value; } } public abstract DateTime Now { get; } public static void ResetToDefault() { TimeProvider.current = DefaultTimeProvider.Instance; } } public class DefaultTimeProvider : TimeProvider { private readonly static DefaultTimeProvider instance = new DefaultTimeProvider(); private DefaultTimeProvider() { } public override DateTime Now { get { return DateTime.Now; } } public static DefaultTimeProvider Instance { get { return DefaultTimeProvider.instance; } } } }
在實際代碼中使用方法:單元測試
var now = TimeProvider.Current.Now;
單元測試模擬方法:測試
var timeMock = new Mock<TimeProvider>(); timeMock.SetupGet(tp => tp.Now).Returns(new DateTime(2010, 3, 11)); TimeProvider.Current = timeMock.Object;
須要用到moq4模擬對象spa