2016-07-14 60 views
1

我們希望對執行命名查詢的某些服務器端組件執行單元測試,這些組件構造函數接收一個EntityManager。檢索「IsClient = false」EntityManager進行單元測試

我們的單元測試框架基於NUnit,我們在非分佈式模式下運行測試來模擬2層部署。不幸的是,從單元測試代碼創建一個EntityManager將始終生成一個「客戶」管理器,而我們需要一個「服務器」版本(即與服務器方法中獲得的版本相同)。當我們獲得客戶端版本時,由於模型上的安全約束,我們正在測試的代碼中的一些命名查詢被拒絕。

有沒有一種很好的方法來檢索EntityManager,並以某種方式模擬單元測試端的服務器行爲?我到目前爲止最好的方式是調用專用的服務器方法,將EntityServer存儲在全局變量中的某個地方,並使用單元測試中的那個方法。

問候

回答

2

正如您看到的,DF是不是特別單元測試友好,您使用的方法是一個很好的解決方法。

無論實際部署如何,DevForce「服務器端」組件(例如IEntityLoginManager,EntityServerQueryInterceptors等)都將始終被調用(如果找到)。因此,即使在運行雙層單元測試時,DF也會啓動內存中的EntityServer並查找服務器端組件,以便滿足來自EntityManager的請求。

如果遇到ClientCanQuery授權檢查問題,這意味着默認的EntityServerQueryInterceptor授權邏輯正在踢入。您可以使用DevForce的「組合上下文」功能實現自定義攔截器以進行測試。使用自定義測試攔截器,您可以覆蓋默認授權邏輯以允許運行這些查詢。有一些關於在測試中使用組合環境的信息here。或者,如果您想擴展「unit」測試的含義,並且由於服務器端組件將被調用,您可以編寫簡單的客戶端單元測試,從而觸發您期望的特定服務器端邏輯測試。 例如,在客戶端上調用的簡單命名查詢將導致您的命名查詢提供程序和/或查詢攔截器中的特定邏輯運行,並且測試可以驗證結果。