2012-09-10 56 views
0

我在企业环境中工作,我们的前端(客户端和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将会对业务层的调用在网络上,并使用fromto作为调用参数。转换然后将数据转换为我的类型。

TRaw是服务返回的类型,TData是前端内的类型和IQueryable内的类型,TRange是范围类型。

因此,这将是可能的:

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

...或等同的OData。

这是ExpressionVisitor的用途。我需要使用ExpressionVisitor来查找From和To日期。

我看了一些教程,并提出了一些想法。我遇到的问题是我不知道如何单元测试ExpressionVisitor。我将如何创建一个与Queryable扩展方法创建的表达式相等的表达式?

回答

1

我会写每个测试案例有一个特定的表达式树作为输入和(在你的情况)期望某个范围作为输出。指定表达式树可以通过多种方式完成: - 您可以通过调用Expression.Call等手动创建表达式树(每种表达式节点在创建它的表达式类型上都有一个静态方法)。 - 你可以为你做了上述 使用扩展方法创建的表达式树 - 您可以使用查询综合创建表达式树

每个将结束与一个表达式树(从那里语法选择)。扩展方法最终调用Expression。方法。其中大部分实际上只是将一个Call表达式注入到树中 - 您可以在反汇编程序或调试器中公开可用的源代码中查看。

查询理解语法只是将调用写入扩展方法的另一种方式,所以最终你也会得到同样的结果。

在单元测试中,您甚至不必运行查询语句,只需创建它,对其应用表达式树并运行表达式访问者就足够了。