2012-05-15 15 views
0

測試時間相關方法的標準/推薦方法是什麼?如何測試時間相關的方法?

舉個例子:

我有一個類Foo具有方法GetTimestamp()GetTimestamp()應該返回給定的時間在string總是字典序增加(按字母排序)。

什麼是最好的方式來測試這個沒有過度工程測試的目的?

我最初的想法是創建一個接受IDateTimeProvider其唯一的財產是DateTime屬性,然後從單元測試,我可以創建一個虛擬DateTimeProvider類構造函數...

這是一個簡單的案件,但代表我在想什麼。

這有很多其他的應用,如圍繞閏年測試日期相關的邏輯等

回答

1

我喜歡做的是創建一個公共函數,該函數在需要當前日期/時間的類中返回DateTime(Func<DateTime>),並將其設置爲默認返回DateTime.Now。然後,在測試過程中,我注入了一個測試函數,它返回我想測試的任何DateTime。

public class MyClass 
{ 
    public Func<DateTime> DateTimeNow =() => DateTime.Now; 

    public void MyMethod() 
    { 
     var currentTime = DateTimeNow(); 
     //... do work 
    } 
} 

public class MyClassTest 
{ 
    public void TesttMyMethod() 
    { 
     // Arrange 
     var myClass = new MyClass(); 
     myClass.DateTimeNow =() => new DateTime(1999, 12, 31, 23, 59, 59); 

     // Act 
     myClass.MyMethod(); 

     // Assert 
     // my asserts 
    } 
} 
+0

嘿,那是一個3歲的問題!從那以後事情發生了變化。好的方法。還有幾個星期前我讀到的這種方法:https://msdn.microsoft.com/en-us/library/hh549176.aspx – jglouie