2012-09-10 57 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表達式注入到樹中 - 您可以在反彙編程序或調試器中公開可用的源代碼中查看。

查詢理解語法只是將調用寫入擴展方法的另一種方式,所以最終你也會得到同樣的結果。

在單元測試中,您甚至不必運行查詢語句,只需創建它,對其應用表達式樹並運行表達式訪問者就足夠了。