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

具体而言,此特定项目正在使用Linq to Sql。实际上,这是我第一次使用Linq到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<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 */

最佳答案

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

关于c# - q鼠加盟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9245020/

10-14 22:49