Как бы вы проверили модульный тест 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 в дерево для себя - вы можете посмотреть в дизассемблере или в общедоступном исходном коде в отладчике.
Синтаксис понимания запросов - это просто еще один способ написать вызов метода расширения, так что в итоге вы получите то же самое.
В модульных тестах вам даже не нужно запускать запрос, поэтому достаточно просто создать его, применить к нему дерево выражений и запустить посетитель выражений.