2012-02-11 98 views
3

一次性把我的頭放在了人羣中:任何人都知道如何成功設置一個Mole(或任何其他單元測試工作)來加入Linq?Linq的痣加入

具體來說,這個特定的項目是使用Linq to Sql。實際上,這是我第一次使用Linq to Sql,並試圖證明有效且正確的單元測試。我有一個方法將TableA和TableB(通過外鍵鏈接)創建一個基本上基於TableA建模的數據傳輸對象。代碼是準確的,因爲我不得不離開它的工作。

public List<TableADto> GetTableA() 
{ 
    using (MyDataContext context = new MyDataContext) 
    { 
     var query = from a in context.a 
       join b in context.b on a.ForeignId equals b.ForeignId 
       select MyBuilderClass.CreateTableADto(a, b); 

     return query.ToList(); 
    } 
} 

我覺得它的代碼非常優雅,它在系統測試中運行得非常漂亮。但我無法弄清楚如何進行單元測試。我有一個莫爾斯的老用戶設置彎路。對於單個表的查詢,我可以簡單地把一個痣

System.Linq.Data.Moles.MTable<TableA>.AllInstances.GetEnumerator = ... 

多個表,我發現我還需要創建一個存根IQueryProvider,我需要存根出的createQuery方法。但即使這樣做,我也收到一條錯誤消息,指出CreateExpression不存在殘留。我試過

  • MTable<TableA>.AllInstances.CreateQueryExpression = (Expression e) => { return listA.AsQueryable().Provider; }
  • MTable<TableA>.AllInstances.CreateQueryExpression01(Expression e => listA.AsQueryable().Provider; }
  • MTable<TableA>.AllInstances.CreateQueryExpression<TableB> = (Expresion e) => { return listB.AsQueryable().Provider; }
  • // MTable<TableA>.AllInstances.CreateQueryExpression<Tablea> = (Expresion e) => { return listA.AsQueryable().Provider; } /* REDUNDANT WITH THE FIRST ONE */
+0

你能在新的答案中回答你的問題嗎?這將從未答覆的列表中刪除此問題,並幫助其他人快速找到答案。 – Polity 2012-02-23 02:14:39

+0

好點,現在就這樣做。 – sfuqua 2012-02-23 18:46:59

回答

0

這裏的解決方案:MTable can be instantiated。這非常有幫助。我需要爲每種類型設置兩種不同方法的存根。以下代碼完美工作:

// Note: typeAList = List<TypeA> with values populated in the test itself 

System.Data.Linq.Moles.MTable<TypeA> typeATable = new System.Data.Linq.Moles.MTable<TypeA>(); 
typeATable.Bind(typeAList); 
typeATable.ProviderSystemLinqIQueryableget =() => typeAList.AsQueryable().Provider; 
typeATable.ExpressionSystemLinqIQueryableget =() => typeAList.AsQueryable().Expression; 
MyLibrary.Data.Moles.MMyDataContext.AllInstances.TypeAsGet = (c) => { return typeATable; }; 

System.Data.Linq.Moles.MTable<TypeB> typeBTable = new System.Data.Linq.Moles.MTable<TypeB>(); 
typeBTable.Bind(typeBList); 
typeBTable.ProviderSystemLinqIQueryableget =() => typeBList.AsQueryable().Provider; 
typeBTable.ExpressionSystemLinqIQueryableget =() => typeBList.AsQueryable().Expression; 
MyLibrary.Data.Moles.MMyDataContext.AllInstances.TypeBsGet = (c) => { return typeBTable; };