Dynamic CRM插件调试与单元测试

背景

使用Dynamic CRM平台开发完业务插件后,不可避免的就是进行插件调试,测试插件是否正常运行,网上关于Dynamic CRM的资料比较少,但对于调试的博客还是挺多的,足可见插件调试对于Dynamic CRM平台开发的重要性,网上的调试方法大差不差,根据网上的例子在项目中实践调试后,也想将适合我的调试方法记录下来。

调试方法

(直接附加程序的方式 不友好且比较简单不特别介绍)

一、使用插件工具中的分析器Profiler
1.打开插件工具PluginRegistration 点击安装Install Profiler

2.选中要调试的插件Step,点击Start Profiling

保持默认,直接点击OK

3.去Dynamic CRM平台里 操作注册插件的实体,点击保存的时候,会弹出来业务流程错误的提示,点击下载日志文件(并不是真的有错误 下载的文件用来后面复现操作调试用)

 4.去插件工具中关掉Profiing,点击Stop Profiling

 5.点击Debug,重演操作

 6.打开VS,找到插件的代码,设置断点,附加PluginRegistration进程

 

 7.回到插件工具点击Start Execution

 

 VS中会命中断点,进行VS调试即可。

 

 二、基于RhinoMocks的单元测试

单元测试调试插件也是一种常规的方法,个人更喜欢这种方式,虽然可能在模拟实体数据的时候会比较费劲。
1.VS中添加单元测试项目

 

 2.Nuget包中添加RhinoMocks、Microsoft.CrmSdk.CoreAssemblies

 

 

 3.编写测试,除了获取和设置实体处不同外,其他的都是通用的代码

 1 ClientCredentials clientCredentials = new ClientCredentials();
 2             clientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("MSCRM用户名", "密码", "");
 3             IServiceProvider serviceProvider = MockRepository.GenerateMock<IServiceProvider>();
 4             IPluginExecutionContext context = MockRepository.GenerateMock<IPluginExecutionContext>();
 5             IOrganizationServiceFactory factory = MockRepository.GenerateMock<IOrganizationServiceFactory>();
 6             IOrganizationService service = MockRepository.GenerateMock<IOrganizationService>();
 7 service = new OrganizationServiceProxy(
 8                 new Uri("http://127.0.0.1:80/Devbrock/XRMServices/2011/Organization.svc"), null, clientCredentials,
 9                 null); //Url为项目地址
10 ParameterCollection paramBag = new ParameterCollection();
11             //从数据库中检索crm_marketingperson实体中一条id为  的数据
12             Entity currentent = service.Retrieve("crm_marketingperson", new Guid("59F07FCA-CF5C-E911-80D9-E2DBE4BB07CF"),
13                 new Microsoft.Xrm.Sdk.Query.ColumnSet(true));
14             //也可以直接创建 一个测试用的实体
15             paramBag.Add("Target", currentent);
16             context.Stub(x => x.InputParameters).Return(paramBag);
17             serviceProvider.Stub(x => x.GetService(typeof(IPluginExecutionContext))).Return(context);
18             serviceProvider.Stub(x => x.GetService(typeof(IOrganizationServiceFactory))).Return(factory);
19             factory.Stub(x => x.CreateOrganizationService(null)).Return(service);
20 
21 //最后调用插件,将封装好的serviceProvider传进去
22 TestPlugin testPlugin = new TestPlugin();
23  testPlugin.Execute(serviceProvider);
View Code

总结:
调试的目的是为了检测问题,不论哪种方法,定位到问题,然后解决问题就可以了。

参考网址:

https://www.cnblogs.com/cuig/p/9077461.html

https://blog.csdn.net/vic0228/article/details/70948816

原文地址:https://www.cnblogs.com/adingfirstlove/p/10708731.html