使用 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();
}
两个选项:
您的 WorkOrderService 有一个错误,您的单元测试运行完美。
FakeXrmEasy 框架有一个错误。我会更改您的测试以检索 abc_OrderTask 并验证它是否具有 RegardingObjectId。如果可以,但连接不起作用,请将您的发现作为错误提交到 GitHub 页面。
abc_OrderTask
是自定义 activity。活动是相关对象 (abc_workorder
) 的子记录,由 abc_OrderTask.RegardObjectId
定义。看来这在您的测试数据中设置正确。
正在测试的方法 GetTasks 正在基于从 abc_workorder
到 abc_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
如何在 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();
}
两个选项:
您的 WorkOrderService 有一个错误,您的单元测试运行完美。
FakeXrmEasy 框架有一个错误。我会更改您的测试以检索 abc_OrderTask 并验证它是否具有 RegardingObjectId。如果可以,但连接不起作用,请将您的发现作为错误提交到 GitHub 页面。
abc_OrderTask
是自定义 activity。活动是相关对象 (abc_workorder
) 的子记录,由 abc_OrderTask.RegardObjectId
定义。看来这在您的测试数据中设置正确。
正在测试的方法 GetTasks 正在基于从 abc_workorder
到 abc_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