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);
总结:
调试的目的是为了检测问题,不论哪种方法,定位到问题,然后解决问题就可以了。
参考网址:
https://www.cnblogs.com/cuig/p/9077461.html
https://blog.csdn.net/vic0228/article/details/70948816