Как бы вы проверили модульный тест ExpressionVisitor?

Я работаю в корпоративной среде, и наши внешние клиенты (клиент и сеть) не имеют прямого доступа к БД, а просто общаются со службами по сети. Начата проверка концепции для доступного извне веб-API ASP.Net, и мы думали о том, чтобы попытаться использовать реализацию IQueryable, чтобы иметь возможность использовать OData. Проблема заключается в том, что веб-API будет еще одним "внешним интерфейсом", который обращается к сервисному уровню, который находится вдали от сети, что означает, что мы должны написать собственную реализацию IQueryable.

Одна реализация IQueryable - это то, что я называю RangeQueryable, который будет абстрактным и принимает три общих параметра; TRaw, TData, TRange. Было бы IQueryable<TData>

var queryable = new RangeQueryableImplementation<RawData, ConvertedData, DateTime>("Created");

В предыдущей строке кода RawData - TRaw, ConvertedData - TData, а DateTime - TRange.

RangeQueryable также имеет два абстрактных метода.

public abstract IEnumerable<TRaw> GetData(TRange from, TRange to);
public abstract TData Convert(TRaw raw);

GetData будет вызывать уровень обслуживания по сети и использовать from а также to в качестве параметров в вызове. Конвертировать будет преобразовывать данные в мои типы.

TRaw - это тип, который будет возвращать служба, TData - это тип во внешнем интерфейсе и тип внутри IQueryable, а TRange - это тип диапазона.

Так что это будет возможно:

queryable.Where(d => d.Created < DateTime.Now && d.Created > DateTime.Now.AddDays(-5))

... или эквивалент OData.

Вот где приходит ExpressionVisitor. Мне нужно использовать ExpressionVisitor, чтобы найти даты От и До.

Я посмотрел некоторые уроки и выдвинул некоторые идеи. У меня проблема в том, что я понятия не имею, как мне провести модульный тест ExpressionVisitor. Как бы я создал выражение, которое эквивалентно тому, что создают методы расширения Queryable?

1 ответ

Решение

Я бы написал каждый тестовый пример как имеющий определенное дерево выражений в качестве входных данных и (в вашем случае) ожидающий определенный диапазон в качестве выходных данных. Задать дерево выражений можно несколькими способами: - Вы можете создать дерево выражений вручную с помощью вызовов Expression.Call и т. Д. (Каждый тип узла выражения имеет статический метод для типа Expression, который его создает). - Вы можете создать дерево выражений, используя методы расширения, как вы делали выше. - Вы можете использовать понимание запросов, чтобы создать дерево выражений (синтаксис select from where)

Каждый из них будет в конечном итоге с деревом выражений. Методы расширения в конечном итоге вызывают выражение. метод также. Большинство из них на самом деле просто внедряют выражение Call в дерево для себя - вы можете посмотреть в дизассемблере или в общедоступном исходном коде в отладчике.

Синтаксис понимания запросов - это просто еще один способ написать вызов метода расширения, так что в итоге вы получите то же самое.

В модульных тестах вам даже не нужно запускать запрос, поэтому достаточно просто создать его, применить к нему дерево выражений и запустить посетитель выражений.

Другие вопросы по тегам