【问题标题】:creating linked data with fakexrmeasy使用 fakexrmeasy 创建链接数据
【发布时间】:2017-07-04 12:01:47
【问题描述】:

如何在 FakeXrmEasy 中创建实体并将另一个实体链接到它?

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

    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

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

    [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 中创建实体并将另一个实体链接到它?

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

    private IOrganizationService _fakeOrganizationService;

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

【问题讨论】:

  • _fakeContext 来自哪里?它与_fakeOrganizationService 有什么关系?我会在你设置这些的地方添加代码。我在github.com/nicknow/… 有一些示例,说明我如何使用 FakeXrmEasy 进行此类测试。
  • 感谢@Nicknow 我将其添加到问题中
  • 谢谢您,但我无法在您的 github 中找到有用的示例
  • 您是否也尝试过:where workOrder.abc_workorderId == workOrderGuid 而不是 where workOrder.Id == workOrderGuid? CRM LINQ 不知道 .Id 属性,只知道 crm 字段,因此您需要在那里使用 PK。
  • 同样适用于连接:在 task.RegardingObjectId.Id 上等于 workOrder.abc_workorderId

标签: c# dynamics-crm-2011 microsoft-dynamics fakeiteasy fakexrmeasy


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢,我已根据您的建议更新了问题,但结果集仍然为空
【解决方案2】:

谢谢大家的回答:)

raising an issue with a unit test on the GitHub page 会更快更容易地回答这个问题,这样我们就可以构建和运行单元测试,看看发生了什么。

无论如何,我会说 Nicknow 是正确的答案,因为您尝试使用 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

【讨论】:

    【解决方案3】:

    两种选择:

    1. 您的 WorkOrderService 中存在错误,您的单元测试运行正常。

    2. FakeXrmEasy 框架中有一个错误。我将更改您的测试只是为了检索 abc_OrderTask 并验证它是否具有有关ObjectId。如果是,但连接不起作用,则在 GitHub 页面上将您的发现作为错误提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 2015-12-18
      • 2021-10-14
      相关资源
      最近更新 更多