0

我試圖爲我繼承的代碼追溯編寫一些單元測試。指定的演員無效

一種特定方法是造成我一個動態CRM 2011插件方法中的問題用LinkedEntityFilterCondition在實體的QueryExpression

結構

聯絡 - (N:1 [查找]) - > CustomEntity1 - (N:1 [查找]) - > CustomEntity2

目標方法

我試圖測試的方法會創建一個QueryExpression,它基於CustomEntity1的屬性過濾Contacts,其中包括LookupFieldCustomEntity2的值。

工作查詢代碼

來測試我的QueryExpression的理解我已經重寫了代碼如下

QueryExpression query = new QueryExpression(); 
    query.EntityName = "contact"; 
    query.ColumnSet = new ColumnSet(true); 

    query.Criteria = new FilterExpression(); 
    query.Criteria.FilterOperator = LogicalOperator.And; 

    FilterExpression filter = new FilterExpression(LogicalOperator.And); 

    FilterExpression filter1 = new FilterExpression(LogicalOperator.Or); 
    filter1.Conditions.Add(new ConditionExpression("new_datefield1", ConditionOperator.Null)); 
    filter1.Conditions.Add(new ConditionExpression("new_datefield1", ConditionOperator.LessEqual, offset)); 

    FilterExpression filter2 = new FilterExpression(LogicalOperator.Or); 
    filter2.Conditions.Add(new ConditionExpression("new_datefield2", ConditionOperator.Null)); 
    filter2.Conditions.Add(new ConditionExpression("new_datefield2", ConditionOperator.LessEqual, offset)); 

    filter.AddFilter(filter1); 
    filter.AddFilter(filter2); 

    query.Criteria.Filters.Add(filter); 

    // Create the link from the contact to the CustomEntity1 entity 
    LinkEntity linkHistory = new LinkEntity(Contact.EntityLogicalName, new_CustomEntity1.EntityLogicalName, Contact.AttributeNames.new_CustomEntity1Lookup, new_CustomEntity1.AttributeNames.Id, JoinOperator.Inner); 
    linkHistory.Columns = new ColumnSet(true); 
    linkHistory.EntityAlias = "custEnt1"; 

    linkHistory.LinkCriteria = new FilterExpression(); 
    linkHistory.LinkCriteria.FilterOperator = LogicalOperator.And; 

    #region code added to make the test work 
    // Create the CustomEntity2 condition 
    LinkEntity linkStatus = new LinkEntity(new_CustomEntity1.EntityLogicalName, new_CustomEntity2.EntityLogicalName, new_CustomEntity1.AttributeNames.new_CustomEntity2Lookup, new_CustomEntity2.AttributeNames.Id, JoinOperator.Inner); 
    linkStatus.Columns = new ColumnSet(true); 
    linkStatus.EntityAlias = "custEnt2"; 

    linkStatus.LinkCriteria = new FilterExpression(); 
    linkStatus.LinkCriteria.FilterOperator = LogicalOperator.And; 
    linkStatus.LinkCriteria.Conditions.Add(new ConditionExpression(new_CustomEntity2.AttributeNames.Id, ConditionOperator.Equal, indStatus.Id)); 

    linkHistory.LinkEntities.Add(linkStatus); 
    #endregion 

    //some code removed for brevity 

    query.LinkEntities.Add(linkHistory); 

此代碼返回一個QueryExpression,其隨後用來進行鍼對測試中,測試通過與FakeXrmEasy中設置的一些測試數據一起運行。但是,我需要確保我的更改不會對當前代碼和邏輯產生負面影響,因此在進行任何更改之前都需要根據當前方法檢查我的結果。

非工作守則

QueryExpression query = new QueryExpression(); 

query.PageInfo = new PagingInfo(); 
query.PageInfo.Count = fetchCount; 
query.PageInfo.PageNumber = pageNumber; 
query.PageInfo.PagingCookie = null; 

// Setup the query for the contact entity 
query.EntityName = Contact.EntityLogicalName; 

// Specify the columns to retrieve 
query.ColumnSet = new ColumnSet(true); 

query.Criteria = new FilterExpression(); 
query.Criteria.FilterOperator = LogicalOperator.And; 

FilterExpression filter1 = new FilterExpression(); 
filter1.FilterOperator = LogicalOperator.Or; 

// Create the e2sds_lastcontactdate condition 
ConditionExpression condition1 = new ConditionExpression(); 
condition1.AttributeName = Contact.AttributeNames.new_DateField1; 
condition1.Operator = ConditionOperator.Null; 

// Create the e2sds_lastcontactdate condition 
ConditionExpression condition2 = new ConditionExpression(); 
condition2.AttributeName = Contact.AttributeNames.new_DateField1; 
condition2.Operator = ConditionOperator.LessEqual; 
condition2.Values.Add(offset); 

FilterExpression filter2 = new FilterExpression(); 
filter2.FilterOperator = LogicalOperator.Or; 

// Create the Last Third Party Contact condition 
ConditionExpression ltpcCond1 = new ConditionExpression(); 
condition1.AttributeName = Contact.AttributeNames.new_DateField2; 
condition1.Operator = ConditionOperator.Null; 

// Create the Last Third Party Contactcondition 
ConditionExpression ltpcCond2 = new ConditionExpression(); 
condition2.AttributeName = Contact.AttributeNames.new_DateField2; 
condition2.Operator = ConditionOperator.LessEqual; 
condition2.Values.Add(offset); 

filter2.Conditions.AddRange(ltpcCond1, ltpcCond2); 

query.Criteria.Filters.Add(filter1); 
query.Criteria.Filters.Add(filter2); 

// Create the link from the contact to the CustomEntity1 entity 
LinkEntity linkHistory = new LinkEntity(); 
linkHistory.JoinOperator = JoinOperator.Natural; 
linkHistory.LinkFromEntityName = Contact.EntityLogicalName; 
linkHistory.LinkFromAttributeName = Contact.AttributeNames.new_CustomEntity1Lookup; 
linkHistory.LinkToEntityName = new_CustomEntity1.EntityLogicalName; 
linkHistory.LinkToAttributeName = new_CustomEntity1.AttributeNames.Id; 

linkHistory.LinkCriteria = new FilterExpression(); 
linkHistory.LinkCriteria.FilterOperator = LogicalOperator.And; 

#region this code throws a specified cast not valid exception 
// Create the e2sds_statusid condition 
ConditionExpression condition3 = new ConditionExpression(); 
condition3.AttributeName = new_CustomEntity1.AttributeNames.new_CustomEntity2LookupField; 
condition3.Operator = ConditionOperator.Equal; 
condition3.Values.Add(status.Id); 
#endregion 

linkHistory.LinkCriteria.Conditions.Add(condition3); 

//removed code for brevity 

query.LinkEntities.Add(linkHistory); 

我已經試過 不幸的是作爲QueryExpressionRetrieveMultiple要求我不能單步執行代碼,找出哪些數據是造成執行無效投射,但是,註釋掉在非工作代碼中標記的區域意味着異常消失。

重寫代碼是一個選項 - 多數民衆贊成我是如何知道TestData的作品,因爲我寫的工作QueryExpression代碼返回一組數據。

我不知道問題現在是否與QueryExpression或FakeXrmEasy一起,因此如果無法提供實際的解決方案,即使提供跟蹤問題根本原因的方法也會有所幫助。

注意:由於保密原因,自定義實體,字段和查找的名稱已更改。如果名稱與代碼問題不匹配,可能會出現手動換位錯誤。

回答

1

這與crmsvcutil生成代理類型的方式有關。不同版本之間可能存在差異。

剛剛更新了問題on GitHub