我有一個問題,單元測試我的代碼,查詢動態CRM 2015年LINQ查詢結果不過濾嘲諷IOrganizationService(動態CRM)時
我使用起訂量框架和嘲弄IOrganizationService
如下:
IList<Account> accounts = new List<Account> {/*...*/};
IList<IEntity> expected = new List<Entity>(accounts);
var collection = new EntityCollection(expected);
var retrieveMultipleResponse = new RetrieveMultipleResponse
{
Results = new ParameterCollection
{
{ "EntityCollection", collection}
}
};
var mockOrganizationService = new Mock<IOrganizationService>();
mockOrganizationService.Setup(os => os.Execute(
It.IsAny<RetrieveMultipleRequest>())).Returns(retrieveMultipleResponse);
因此,IOrganizationService
模擬將始終返回相同的預定義帳戶列表,無論請求是什麼樣子。
這是我想測試代碼:
var query = serviceContext.AccountSet.Where(
a => a.AccountId != null && a.AccountId.Value == guid)
var account = query.FirstOrDefault();
當對一個真正的CRM實例執行這段代碼,它按預期工作。使用模擬的IOrganizationService
,代碼不再工作。在調試器中,我可以看到AccountSet返回預期的帳戶列表(我在模擬期間設置的那個)。但是,Where
方法似乎不會執行,並且query
包含所有帳戶實體。因此,對FirstOrDefault
的調用只返回第一個,而不是調用Where
方法的結果。
如果我修改代碼如下,它也開始在單元測試過程的工作:
var query = serviceContext.AccountSet.ToList().Where(
a => a.AccountId != null && a.AccountId.Value == guid)
var account = query.FirstOrDefault();
如果我理解正確的話,這個代碼檢索所有帳戶,並篩選它們在本地(而不是在CRM)。這對單元測試很好,但在實際應用中這是不可接受的。
任何人都可以請告知我做錯了什麼?謝謝!
編輯:
我們結束了直接從客戶端代碼就可以了嘲諷serviceContext
而不是因爲我們調用的方法(或屬性),而不是IOrganizationService
的人。我認爲如果我們想要測試的代碼直接使用IOrganizationService
而不是通過serviceContext
,那麼嘲笑IOrganizationService
應該是有意義的。否則,我們有兩層嘲弄的東西,它變得凌亂。
你是對的。在ToList()語句之後,所有的行都被檢索出來,並且你正在使用Linq To Objects來過濾這些項目。 CRM linq提供者的實現是錯誤的並且不完整。永遠不要指望使用moq總是會給出與「真正」實現相同的結果。 –
顯示更多關於您正在嘗試測試的代碼的詳細信息,因爲它涉及到'serviceContext.AccountSet',因此[mcve]將允許更好地複製您的問題 – Nkosi
@JeroenHeier,這就是許多原因之一我開始了[FakeXrmEasy](http://dynamicsvalue.com/get-started/overview)。這個自動模擬框架將爲您提供更真實的「真實」組織服務的行爲體驗......並且根本不使用任何模擬遊戲! :) – Jordi