2012-04-28 91 views
2

假設我們有一個典型的資源庫到單元測試Repository.Update方法正道

public class Repository:IRepository<Entity> 
    { 
      public Entity GetById(int id) 
      { 
       //blah 
      } 

      public IEnumerable<Entity> All() 
      { 
       //blah 
      } 

      public void Insert(Entity entity) 
      { 

      } 

      public void Update(Entity entity) 
      { 
       //blah 
      } 

      public void Delete(Entity entity) 
      { 
       //blah 
      } 
    } 

使用MSTest的,我想測試存儲庫的接入能力和更新實體。只要它是具體的Repository,我正在測試一個真正的DB。

所以,當我測試插入方法 - 戰略是明確的

  1. 創建新的實體
  2. 保存
  3. 通過ID獲取實體
  4. 斷言實體由庫返回

但是,當我想到更新方法測試它都有點棘手。 的主要問題是

  • 如何保證數據庫已存儲的對象,我可以取回,並嘗試 更新?
  • 如何針對空數據庫測試更新?

看起來像解決方法將需要一些不必要的代碼和測試會得到臃腫。 有沒有優雅的解決方案?

+0

你打算'單元測試'是不是真的單元測試,因爲你沒有測試一個孤立的單位,而是多個單位的整合。重新思考你想做什麼。如果你想單元測試你的代碼,那麼就單獨測試更新方法。您可以通過測試更新方法是否遵循預期的路徑並使其實例保持其預期狀態來做到這一點。 – Polity 2012-04-28 09:51:19

+0

單元測試我的Repository類處理RDBMS的正確方法是什麼?不知何故,我需要檢查它做它應該做的。 – 2012-04-28 10:00:47

+0

用這種方法試試看:你想單元測試你的更新方法。如果數據庫發生故障(例如磁盤空間已滿),那並不意味着您的更新方法錯誤或中斷。您無需測試您的項目是否已在數據庫中更新。你需要檢查你的更新方法是否做到了你所期望的。 (例如對數據庫層進行正確調用) – Polity 2012-04-28 10:02:52

回答

3

使用ClassInitializeTestInitialize,連同ClassCleanupTestCleanup預填充知名實體的數據庫。然後對他們運行Update()測試。

不確定如何解釋「不必要的代碼」...它看起來像你將不得不做一些事情來填充你的數據庫,以便測試Update()方法;至少使用上面列出的屬性可以實現初始化和清理數據庫所需的邏輯,而不會污染實際的測試方法。

+0

對於不同的測試方法是否可以有不同的TestInitialize方法? – 2012-04-28 10:06:20

+0

否;他們是特定於類的。你可以將測試分成不同的類。 – 2012-04-28 10:22:39