使用 fakexrmeasy 创建链接数据

creating linked data with fakexrmeasy

如何在 FakeXrmEasy 中创建一个实体和 link 另一个实体?

我正在尝试测试这段代码:

    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;
    }

abc_OrderTask和abc_WorkOrder之间的关系是N:1

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

    [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 中创建一个实体和 link 另一个实体?

以下是此对象的更新方式:

    private IOrganizationService _fakeOrganizationService;

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

两个选项:

  1. 您的 WorkOrderService 有一个错误,您的单元测试运行完美。

  2. FakeXrmEasy 框架有一个错误。我会更改您的测试以检索 abc_OrderTask 并验证它是否具有 RegardingObjectId。如果可以,但连接不起作用,请将您的发现作为错误提交到 GitHub 页面。

abc_OrderTask 是自定义 activity。活动是相关对象 (abc_workorder) 的子记录,由 abc_OrderTask.RegardObjectId 定义。看来这在您的测试数据中设置正确。

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

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

谢谢大家的回答:)

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