2010-09-15 10 views
5

我對於使用TDD相對來說比較陌生,並且最近一直在閱讀有關模擬對象的知識。我有以下測試來測試給定日期返回下一個星期六的方法。我是否應該對以下示例使用模擬

[TestMethod()] 
     public void NextSaturdayTest() 
     { 
      DateTime date = new DateTime(); 
      date = DateTime.Parse("2010-08-14"); 
      DateTime expected = new DateTime(); 
      expected = DateTime.Parse("2010-08-21"); 
      DateTime actual; 
      actual = DateExtensions.NextSaturday(date); 
      Assert.AreEqual(expected, actual); 

      date = DateTime.Parse("2010-08-19"); 
      expected = DateTime.Parse("2010-08-21"); 
      actual = DateExtensions.NextSaturday(date); 
      Assert.AreEqual(expected, actual); 
     } 

首先,這是否代表良好的測試實踐? 其次,利用模擬框架來創建這個測試有什麼好處?

讓我知道我是否可以提供更多信息。

感謝任何想法

回答

7

首先,不這樣做:

DateTime date = new DateTime(); 
date = DateTime.Parse("2010-08-14"); 

您正在創建一個新的日期時間,然後把它扔了,當你解析字符串來獲得新的datetime.Remember,測試代碼應該仍然是很好的代碼。

二,好的測試測試一件事。您可能有多個測試,如ReturnsCorrectNextSaturdayGivenAWednesdayReturnsCorrectNextSaturdayWhenCrossesEndOfMonthReturnsCorrectNextSaturdayWhenCrossesEndOfYear

最後,沒有理由在這裏嘲笑。如果您的DateExtensions調用另一個組件(比如數據庫),並且您想僞造該調用,則模擬將是適當的。因此,不是測試DateExtensions + Data Access,而只是測試DateExtensions以及何時調用數據訪問層,這將是您的測試設置的模擬。

5

嘲諷用於滿足依賴性。

例如,試想,如果你有一個加載的用戶使用IDataLayer(圍繞數據庫包裝)數據庫的類

測試時,你不想來測試對數據庫。這使得很難提供數據並檢查結果。相反,您可以模擬一個IDataLayer對象,以便能夠手動向UserService提供用戶。它使得驗證UserService完成它應該做的事情變得更容易。

至於你的測試方法。我將它分成兩種方法,因爲你正在運行兩個不同的測試(儘管在同一方法上)

2

在這種情況下,模擬框架是不必要的,因此不應該使用。

你的測試是相當合理的。我個人最內嵌的日期解析爲更好的可讀性:

[TestMethod()] 
    public void NextSaturdayTest() 
    { 
     DateTime actual = DateExtensions.NextSaturday(DateTime.Parse("2010-08-14")); 
     Assert.AreEqual(DateTime.Parse("2010-08-21"), actual); 

     actual = DateExtensions.NextSaturday(DateTime.Parse("2010-08-19")); 
     Assert.AreEqual(DateTime.Parse("2010-08-21"), actual); 
    } 
2

我覺得你沒關係在這種情況下嘲笑。通常情況下,你會嘲笑某種依賴(例如,如果你有DateProvider什麼的),但在這種情況下,直接使用DateTime看起來不錯。

然而,我會清理你的測試一些。你應該堅持每種方法測試一件事情,因爲如果這種測試方法失敗了,你會知道爲什麼它失敗了,而不是必須檢查斷言,並想知道其餘的是否會通過。

[TestMethod()] 
public void NextSaturdayReturnsCorrectValueStartingFromASaturday() 
{ 
    DateTime date = DateTime.Parse("2010-08-14"); 

    DateTime expected = DateTime.Parse("2010-08-21"); 
    DateTime actual = DateExtensions.NextSaturday(date); 

    Assert.AreEqual(expected, actual); 
} 

[TestMethod()] 
public void NextSaturdayReturnsCorrectValueWithinTheSameWeek() 
{ 
    DateTime date = DateTime.Parse("2010-08-19"); 
    DateTime expected = DateTime.Parse("2010-08-21"); 
    DateTime actual = DateExtensions.NextSaturday(date); 

    Assert.AreEqual(expected, actual); 
} 

正如其他人所建議的,繼續擴展您的測試班,以包括檢查您可能遇到的一些陌生情況。

相關問題