2011-01-09 22 views
0

我努力學習,特別是使用起訂量實現TDD設置,我碰到了一個設計,我無法弄清楚如何嘲笑:不能嘲笑像TableDomainService其中的EntityContext在類定義

namespace RIACompletelyRelativeWebService.Web.Services 
{ 
    [EnableClientAccess] 
    public class AncestorDomainService : TableDomainService<AncestorEntityContext> 
    { 
     public AncestorDomainService() 
     { 
      //this.EntityContext = new AncestorEntityContext(); 
     } 
     public IQueryable<AncestorEntity> GetAncestorEntities() 
     { 
      return this.EntityContext.AncestorEntities; 
     } 

     public void AddAncestorEntity(AncestorEntity entity) 
     { 
      this.EntityContext.AncestorEntities.Add(entity); 
     } 
    } 
} 

我想我需要模擬TableDomainService,這樣我才能測試我的AncestorDomainService邏輯而不需要啓動Azure。我厭倦了這樣的事情:

public class AncestorDomainService<TEntityContext> : TableDomainService<TEntityContext> where TEntityContext is a TableEntityContext 

但是,在TableDomainService並不想再使用一個通用的存在。我也嘗試設置EntityContext,但它是隻讀的。我見過其他人使用通用的DomainService和Repository設計模式,但由於TableDomainService是讓我在幕後使用Azure表的人,我想我必須堅持使用TableDomainService <>。我是否必須僞造返回的TableDomainService,TableEntityContext和TableEntitySet?

回答

2

我不知道從上面的代碼,你想測試的邏輯是什麼樣子,但你可以嘗試從服務本身分離你的代碼(你想測試的代碼)。

您可以嘗試抽象AncestorDomainService(引入IAncestorDomainService)並使用moq來模擬IAncestorDomainService。您的邏輯將轉移到另一個具有對IAncestorDomainService的依賴關係的類。我已經用Linq2Sql(它似乎有一個類似的設計,也返回IQueryable)做到了這一點。我不會試圖嘲笑TableDomainService的'內部',因爲這些東西通常不是爲了簡單的測試而設計的。

0

最好的解決方案,如果你能負擔得起的時間,是讓你的代碼完全可測試。這意味着實際上擁有必要的腳本來設置已知良好狀態的Azure實例(真實或本地)。

由於您的AncestorDomainService的整個要點是要處理Azure,因此嘲笑它的基類對於測試的有效性預測沒有多大意義。 (有些人選擇優化測試速度而不是效率,但我認爲這是浪費時間。)