我在企业环境中工作,我们的前端(客户端和Web)没有直接的数据库访问权限,而是通过网络与服务通话。概念工作的证明已经开始用于外部可用的ASP.Net Web API,并且我们正在考虑尝试使用IQueryable的实现来使用OData。问题是Web API将成为另一个访问网络跳跃的服务层的“前端”,这意味着我们必须编写自己的IQueryable实现。你会如何测试ExpressionVisitor?
一个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来查找From和To日期。
我看了一些教程,并提出了一些想法。我遇到的问题是我不知道如何单元测试ExpressionVisitor。我将如何创建一个与Queryable扩展方法创建的表达式相等的表达式?