Кроты для Linq Присоединиться - PullRequest
3 голосов
/ 12 февраля 2012

Разрушил мне голову на этот раз, чтобы отдать это толпе: кто-нибудь знает, как успешно установить Mole (или любой другой метод тестирования юнитов) для Join in Linq?

В частностиэтот конкретный проект использует 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 */

1 Ответ

0 голосов
/ 23 февраля 2012

Вот решение: MTable может быть создан . Это очень помогает. Мне нужно было установить заглушку на два разных метода для каждого из моих типов. Следующий код работал отлично:

// 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; };
...