我在一个企业环境中工作,我们的前端(客户端和web)不能直接访问数据库,而是通过网络与服务通信。一个外部可用的ASP.Net网络应用程序接口的概念验证工作已经开始,我们正在考虑尝试使用一个能够使用OData的IQueryable实现。问题是web将是另一个“前端”,它访问一个网络跳跃之外的服务层,这意味着我们必须编写我们自己的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作为参数。Convert然后会将数据转换成我的类型。
TRaw是服务将返回的类型,TData是前端和IQueryable内部的类型,TRangeis是range类型。
所以这是可能的:
queryable.Where(d => d.Created < DateTime.Now && d.Created > DateTime.Now.AddDays(-5))...or OData等效项。
这就是ExpressionVisitor的用武之地。我需要使用ExpressionVisitor来查找From和to日期。
我已经看了一些教程,并提出了一些想法。我遇到的问题是,我不知道如何对ExpressionVisitor进行单元测试。如何创建一个与Queryable扩展方法创建的表达式等效的表达式?
发布于 2012-09-11 16:57:03
我会将每个测试用例编写为一个特定的表达式树作为输入,并(在您的例子中)期望特定的范围作为输出。可以通过多种方式指定表达式树:-您可以通过调用Expression.Call等方式手动创建表达式树(每种类型的表达式节点在创建它的表达式类型上都有一个静态方法)。-可以像上面那样使用扩展方法创建表达式树-可以使用查询理解来创建表达式树( select from where语法)
其中的每一个都将以表达式树结束。扩展方法最终调用表达式。方法也是如此。它们中的大多数实际上只是将调用表达式注入到树中到它们自己-你可以在反汇编程序中或在调试器中的公开源代码中查看一下。
查询理解语法只是编写对扩展方法的调用的另一种方式,因此您最终也会得到相同的结果。
在单元测试中,您甚至不需要运行queryable,所以只需创建它,对其应用表达式树,并运行表达式访问器就足够了。
https://stackoverflow.com/questions/12359821
复制相似问题