背景
使用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);
总结:
调试的目的是为了检测问题,不论哪种方法,定位到问题,然后解决问题就可以了。
参考网址: