2012-03-15 25 views
2

我有一個測試文件,我在其中存根測試類的依賴關係(主要是存儲庫)。存儲庫的 例存根(從約200線縮短):如何避免爲類似的存根重複代碼?

internal class doerRepository : IDoerRepository 
{ 
    public IQueryable<Doer> ActiveDoers 
    { 
     get 
     { 
      Account account = new Account(); 
     //Property setting for account 

     Zone zone = new Zone(); 
     //Property setting for zone 

     Doer doer = new Doer(); 
     doer.Zone = doerZone; 
     doer.Account = doerAccount; 

     var list = new List<Doer>(); 
     list.Add(doer); 
     return list.AsQueryable(); 
    } 
} 

}

和測試方法如下所示:

[Test] 
public void IsValidDoer_DoerIsValid() 
{ 
    var doerValidation = new DoerValidation(new doerRepository()); 
    //Assert things 
} 

的問題是,這種實體環境(它存根大約一半的數據庫)是我的基準。我有大約25個測試來製作這個測試文件。對於每個測試,我必須稍微更改存根(嘗試使用無效區域,無效帳戶等)。我最終複製粘貼200行來改變一個小東西(我必須重新命名這個類)。

是否可以重複使用存根代碼並進行相關更改? 我嘗試這樣做,但我改變的價值不是用一些隔離框架更新

internal class doerRepository2 : IDoerRepository 
{ 
    public IQueryable<Doer> ActiveDoers 
    { 
     get 
     { List<Doer> list = new doerRepository().ActiveDoers.ToList(); 
      list.First().Account = new Account(); 
      return list.AsQueryable(); 
     } 
    } 
} 

回答

3

可避免手寫存根。它允許一個動態創建存根。我個人比較喜歡Moq。有了它,你的測試就可以用這種方式寫出來。

[Test] 
public void IsValidDoer_DoerIsValid() 
{ 
    var mockRepository = new Mock<IDoerRepository>(); 
    var activeDoers = CreateSpecificDoerList(); 
    mockRepository.Setup(r => r.ActiveDoers).Returns(activeDoers); 

    var doerValidation = new DoerValidation(mockRepository.Object); 

    // Assert things 
} 

在這裏,你正在創建一個動態的存根和告訴它ActiveDoers應該回到你的實幹家的具體名單。

+0

Awsome,這有助於! – Mathieu 2012-03-15 03:43:18

1

我傾向於通過在我的存根上添加額外的setter屬性來解決此問題,以便能夠設置返回模擬數據以支持待測試方法的存根方法中返回的值。

這種方式我通常只有一個存根,因爲我可以通過設置返回的不同數據組合來重新使用它。

+0

是的,這也可以增加靈活性! – Mathieu 2012-03-15 11:19:11