Fake Xrm Easy如何在orgService.Create时模拟Dynamics CRM 2015插件行为
解决方案
你可以通过两种方式在Fake Xrm Easy中模拟该插件自动生成new_master_id的行为:
方式1:使用消息拦截回调(最简实现)
直接在Create消息执行后插入自定义逻辑,模拟插件填充字段的效果,修改后的测试代码如下:
var fakedContext = new XrmFakedContext(); fakedContext.ProxyTypesAssembly = typeof(Lead).Assembly; var entities = new Entity[] { // 预置数据为空 }; fakedContext.Initialize(entities); // 注册Create消息的后处理回调,模拟插件逻辑 fakedContext.OnCreateMessageExecuting += (entity) => { if (entity.LogicalName == Lead.EntityLogicalName) { // 模拟插件生成Guid赋值给new_master_id entity["new_master_id"] = Guid.NewGuid().ToString(); } }; var orgService = fakedContext.GetOrganizationService(); var lead = new Lead { FirstName = "James", LastName = "Bond" }; var leadId = orgService.Create(lead); var masterId = orgService.Retrieve(Lead.EntityLogicalName, leadId, new Microsoft.Xrm.Sdk.Query.ColumnSet(Lead.Fields.new_master_id)) .ToEntity<Lead>().new_master_id;
这种方式不需要额外定义插件类,适合快速测试单一场景。
方式2:注册模拟插件类(贴近真实场景)
如果你的测试需要和真实插件注册逻辑对齐,可以先定义一个模拟插件类,再注册到Fake上下文中:
- 先定义模拟插件:
public class GenerateMasterIdPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Lead lead) { lead.new_master_id = Guid.NewGuid().ToString(); } } }
- 修改测试代码注册插件:
var fakedContext = new XrmFakedContext(); fakedContext.ProxyTypesAssembly = typeof(Lead).Assembly; var entities = new Entity[] { // 预置数据为空 }; fakedContext.Initialize(entities); // 注册模拟插件:对应Create消息、PostOperation阶段、Lead实体 fakedContext.RegisterPlugin<GenerateMasterIdPlugin>(messageName: "Create", entityLogicalName: Lead.EntityLogicalName, stage: 40); var orgService = fakedContext.GetOrganizationService(); var lead = new Lead { FirstName = "James", LastName = "Bond" }; var leadId = orgService.Create(lead); var masterId = orgService.Retrieve(Lead.EntityLogicalName, leadId, new Microsoft.Xrm.Sdk.Query.ColumnSet(Lead.Fields.new_master_id)) .ToEntity<Lead>().new_master_id;
这种方式更贴近真实CRM的插件运行逻辑,适合需要模拟完整插件生命周期的测试场景。
内容的提问来源于stack exchange,提问作者Andrey Bushman
相关产品推荐
相关产品推荐

