【问题标题】:Moles For Linq JoinLinq 的痣加入
【发布时间】:2012-02-11 23:35:16
【问题描述】:

在这个问题上我一直很头疼 - 是时候把它交给人群了:有人知道如何为 Linq 中的 Join 成功设置 Mole(或任何其他单元测试工作)吗?

具体来说,这个特定的项目正在使用 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();
    }
}

我发现代码的方式非常优雅,并且在系统测试中运行良好。但我不知道如何对其进行单元测试。我有一个 Moles 的资深用户来设置弯路。对于来自单个表的查询,我可以简单地在

上放置一个痣
System.Linq.Data.Moles.MTable<TableA>.AllInstances.GetEnumerator = ...

对于多个表,我发现我还需要创建一个存根 IQueryProvider,并且我需要存根出 CreateQuery 方法。但即使这样做,我也会收到一条错误消息,指出 CreateExpression 没有被存根。我试过了

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

【问题讨论】:

  • 您能在新答案中回答您的问题吗?这将从未回答列表中删除此问题,并帮助其他人快速找到答案。

标签: c# unit-testing linq-to-sql moles


【解决方案1】:

解决方案如下: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; };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多