2

如何在 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();
    }
4

3 回答 3

4

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

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

您需要修复GetTasks过滤abc_OrderTaskRegardingObjectId.Id

于 2017-02-16T02:42:14.633 回答
3

谢谢大家的所有答案:)

通过在 GitHub 页面上提出单元测试问题,这将更快、更容易地回答,这样我们就可以构建和运行单元测试并查看发生了什么。

无论如何,我会说 Nicknow 是正确的答案,因为您尝试使用 1->N 属性而不是我以前做的过滤 LINQ 表达式中的记录,这恰恰相反,通过关联的 EntityReference (RegardingObjectId .Id)就像尼克建议的那样。

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

希望这可以帮助!

[编辑]:由于 FakeXrmEasy 本身也经过单元测试,您会在此处找到大量不同的查询示例

于 2017-02-16T08:54:22.163 回答
-1

两种选择:

  1. 您的 WorkOrderService 中存在错误,并且您的单元测试工作正常。

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

于 2017-02-15T20:41:04.813 回答