2012-02-11 65 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; };