背景
使用 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. 编写测试, 除了获取和设置实体处不同外, 其他的都是通用的代码
- ClientCredentials clientCredentials = new ClientCredentials();
- clientCredentials.Windows.ClientCredential = new System.NET.NetworkCredential("MSCRM 用户名", "密码", "域");
- IServiceProvider serviceProvider = MockRepository.GenerateMock<IServiceProvider>();
- IPluginExecutionContext context = MockRepository.GenerateMock<IPluginExecutionContext>();
- IOrganizationServiceFactory factory = MockRepository.GenerateMock<IOrganizationServiceFactory>();
- IOrganizationService service = MockRepository.GenerateMock<IOrganizationService>();
- service = new OrganizationServiceProxy(
- new Uri("http://127.0.0.1:80/Devbrock/XRMServices/2011/Organization.svc"), null, clientCredentials,
- null); //Url 为项目地址
- ParameterCollection paramBag = new ParameterCollection();
- // 从数据库中检索 crm_marketingperson 实体中一条 id 为 的数据
- Entity currentent = service.Retrieve("crm_marketingperson", new Guid("59F07FCA-CF5C-E911-80D9-E2DBE4BB07CF"),
- new Microsoft.Xrm.Sdk.Query.ColumnSet(true));
- // 也可以直接创建 一个测试用的实体
- paramBag.Add("Target", currentent);
- context.Stub(x => x.InputParameters).Return(paramBag);
- serviceProvider.Stub(x => x.GetService(typeof(IPluginExecutionContext))).Return(context);
- serviceProvider.Stub(x => x.GetService(typeof(IOrganizationServiceFactory))).Return(factory);
- factory.Stub(x => x.CreateOrganizationService(null)).Return(service);
- // 最后调用插件, 将封装好的 serviceProvider 传进去
- TestPlugin testPlugin = new TestPlugin();
- testPlugin.Execute(serviceProvider);
- View Code
总结:
调试的目的是为了检测问题, 不论哪种方法, 定位到问题, 然后解决问题就可以了.
参考网址:
https://www.cnblogs.com/cuig/p/9077461.html
来源: https://www.cnblogs.com/adingfirstlove/p/10708731.html