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.编写测试,除了获取和设置实体处不同外,其他的都是通用的代码
- 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);
总结:
调试的目的是为了检测问题,不论哪种方法,定位到问题,然后解决问题就可以了。
参考网址:
https://www.cnblogs.com/cuig/p/9077461.html
https://blog.csdn.net/vic0228/article/details/70948816
Dynamic CRM插件调试与单元测试的更多相关文章
- Dynamic CRM插件中记录日志-Nlog记录到文本
Dynamic CRM插件中记录日志的方式有多种 通常情况下分为ITracingService记录.单独日志表插入记录.文本记录三种. 之前整理过ITracingService记录的方式,但这种记录有 ...
- Dynamic CRM 2013学习笔记(二)插件基本用法及调试
插件是可与 Microsoft Dynamics CRM 2013 和 Microsoft Dynamics CRM Online 集成的自定义业务逻辑(代码),用于修改或增加平台的标准行为.也可 ...
- Dynamic CRM 2013学习笔记(二十三)CRM JS智能提示(CRM 相关的方法、属性以及页面字段),及发布前调试
我们知道在CRM的js文件里引用XrmPageTemplate.js后,就可以实现智能提示,但每个js文件都引用太麻烦了,其实可以利用vs的功能让每个js文件自动实现智能提示CRM的js: 另外,我们 ...
- Dynamic CRM 2013学习笔记(一)插件输入实体参数解析
1. 问题描述 最近新建了一个post事件的插件,传入的参数处理如下: 1: if (context.InputParameters.Contains("Target") &a ...
- Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具
基本上每个实体form上都会有单据编号,而且不同的实体编号要求还不太一样,这时就需要一个通用的单据编号插件,可配置以应对不同的需求. 下面简单介绍下实现步骤: 1. 创建二个实体,以保存各实体所要求的 ...
- Dynamic CRM 2013学习笔记(十二)实现子表合计(汇总,求和)功能的通用插件
上一篇 Dynamic CRM 2013学习笔记(十一)利用Javascript实现子表合计(汇总,求和)功能 , 介绍了如何用js来实现子表合计功能,这种方法要求在各个表单上添加js方法,如果有很多 ...
- Dynamics CRM 客户端的插件调试
Dynamics CRM 客户端的插件调试 一直以来,Dynamics CRM插件在大家的印象中都是不便于调试的,根据官方文档(http://technet.microsoft.com/zh-cn/l ...
- Dynamic CRM 2013学习笔记(二十二)插件里调用WCF服务
1. 添加service: 2.调用WCF BasicHttpBinding myBinding = new BasicHttpBinding(); myBinding.Name = &q ...
- Dynamic CRM 2013学习笔记 系列汇总
这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...
随机推荐
- Log4j介绍与使用
Log4j三大组件 1) 日志记录器Logger负责输出日志信息,并能够对日志信息进行分类筛选,决定哪些日志信息应该被输出,哪些该被忽略.Loggers组件输出日志信息时分为5个级别:DEBUG.IN ...
- omitting directory `folder/'
题记:一个问题,若遇见第一次,不知道如何解决,经查资料后处理掉可以原谅:若遇见第二次,还是一头雾水!反省自己,特此备录. 在linux CentOS6.5 系统中复制文件夹时提示如下: cp: omi ...
- Python中__init__()和self的有啥用
这篇博客让我一下子就理解了,https://www.cnblogs.com/illusion1010/p/9527034.html,感谢博主 由于类可以起到模板的作用,因此,可以在创建实例的时候,把一 ...
- HashMap 和 Hashtable 的 6 个区别,一般人不知道最后一条
1.线程安全 Hashtable 是线程安全的,HashMap 不是线程安全的. 为什么说 HashTable 是线程安全的? 来看下 Hashtable 的源码,Hashtable 所有的元素操作都 ...
- CCF CSP 201812-1 小明上学
题目链接:http://118.190.20.162/view.page?gpid=T80 问题描述 试题编号: 201812-1 试题名称: 小明上学 时间限制: 1.0s 内存限制: 512.0M ...
- 【模板】快速幂&取余运算
输入\(b\),\(p\),\(k\)的值,求\(b^p mod k\)的值.其中\(b\),\(p\),\(k^2\)为长整型数. 1.普通做法 \(print\) \(pow(b,p)\)\(mo ...
- 软考自查:UML建模
UML建模 内容提要 用例图 类图与对象图 顺序图 活动图 状态图 通信图 构件图 用例图 包含关系 扩展关系 泛化关系 类图与对象图 填类名,方法名,属性名 填多重度 填关系 1: ...
- 工作中常用的 Shell 命令及技巧
调试 bash 脚本的技巧 加 -x 参数运行 bash 脚本时,会显示执行的语句 # 也可以在 demo.sh 中加上 set -x bash -x demo.sh 设置环境变量,然后通过如上方式运 ...
- 找出 Xcode 编译C/C++过程文件及生成文件
在使用 Xcode 编写C/C++时,会发现在项目的目录位置是没有编译过程的那些 .o .exe 文件,只有一个 C/C++ 源代码 .c 文件.如下图(在Mac OS的finder中右键窗口标题名称 ...
- 使用subline作为Stata外部编辑器,并实现代码高亮
Sublime Text 3在Stata13/14/15 代码编辑中的辅助应用 更友好的格式请见: http://dfadf0be.wiz03.com/share/s/3vHv2-0ALQZE2v ...