1

如何在FakeXrmEasy中创建实体并将其他实体链接到它?使用fakexrmeasy创建链接数据

我试图测试该代码:abc_OrderTask和abc_WorkOrder之间

public List<abc_OrderTask> GetTasks(Guid workOrderGuid) 
    { 
     var result = (from task in _xrmServiceContext.abc_OrderTaskSet 
         join workOrder in _xrmServiceContext.abc_workorderSet 
               on task.RegardingObjectId.Id equals workOrder.Id 
         where workOrder.Id == workOrderGuid 
         select task).ToList(); 

     return result; 
    } 

关系是N:1

在我的测试中,我试图在两个实体链接:

[Test] 
    public void GetTasks_WorkOrderWithExistingTasks_ReturnsListOfTasks() 
    { 
     using (var xrmServiceContext = new XrmServiceContext(_fakeOrganizationService)) 
     { 
      var workOrderGuid = Guid.NewGuid(); 
      var taskGuid = Guid.NewGuid(); 
      var workOrder = new abc_workorder { Id = workOrderGuid }; 
      var task = new abc_OrderTask 
          { 
           Id = taskGuid, 
           Subject = "Required subject", 
           RegardingObjectId = 
            new EntityReference(abc_workorder.EntityLogicalName, workOrderGuid) 
          }; 
      _fakeContext.Initialize(new List<Entity> { workOrder, task }); 

      var sut = new WorkOrderService(xrmServiceContext); 

      // Act 
      // Assert 
      Assert.That(sut.GetTasks(workOrderGuid), Is.InstanceOf<List<abc_OrderTask>>()); 
      Assert.That(sut.GetTasks(workOrderGuid).Count.Equals(1)); 
     } 
    } 

但是,结果集是空的。

如何在FakeXrmEasy中创建实体并将其他实体链接到它?

这里的这个对象是如何获得新的-ED起来:

private IOrganizationService _fakeOrganizationService; 

    [SetUp] 
    public void Init() 
    { 
     _fakeContext = new XrmFakedContext { ProxyTypesAssembly = Assembly.GetAssembly(typeof(abc_workorder)) }; 
     _fakeOrganizationService = _fakeContext.GetFakedOrganizationService(); 
    } 
+0

凡'_fakeContext'哪里来的?它与'_fakeOrganizationService'有什么关系?我会在你设置的地方添加代码。我在https://github.com/nicknow/BloggingCrm-Dynamics-Crm-Plugin-Unit-Testing-Example/blob/master/BloggingCrm.Account.BusinessLogic.Tests/Prove_that_AccountQueries_Is_Working.cs上有一些例子,说明我如何使用FakeXrmEasy做这种类型的测试。 – Nicknow

+0

谢谢@Nicknow我向 –

+0

添加了这个问题,但我还没有找到一个有用的示例,在你的github上 –

回答

3

abc_OrderTask是一项自定义活动。活动是关于对象(abc_workorder)的子记录,由abc_OrderTask.RegardObjectId定义。它似乎在您的测试数据中正确设置。

正在测试的方法GetTasks正在基于从abc_workorderabc_OrderTask之间的自定义N:1关系以及名为abc_workorder_abc_OrderTasks的查找字段进行查询。

您需要修复GetTasks以通过RegardingObjectId.Id过滤abc_OrderTask

+0

非常感谢你,我已经用你的建议更新了这个问题,我仍然得到空结果集 –

-1

两个选项:

  1. 你WorkOrderService中有一个错误,你的单元测试工作完美无缺。

  2. FakeXrmEasy框架有一个bug。我会改变你的测试只是为了检索abc_OrderTask并确认它有一个RegardingObjectId。如果确实如此,但连接无效,请将您的发现作为错误提交到GitHub页面。

2

感谢你们所有的答案:)

这会是快了很多,&更容易raising an issue with a unit test on the GitHub page回答,使我们可以建立并运行单元测试,看看发生了什么事情。

无论如何,我会说Nicknow's是正确的答案,因为您正试图使用​​1-> N属性过滤LINQ表达式中的记录,而不是我曾经做过的事情,而恰恰相反,按照像Nick这样的暗示相关的EntityReference(RegardingObjectId.Id)。

基本上,您可以通过使用关联查找来筛选1:N查询,例如contact.ParentCustomerId.Id等。还有使用相交实体的N:N记录及其关联的查找。这应该适用于LINQ,QueryExpressions和FetchXml。

希望这会有所帮助!

[编辑]:由于FakeXrmEasy也是自身单元测试,你会find loads of different query examples here