背景

使用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插件调试与单元测试的更多相关文章

  1. Dynamic CRM插件中记录日志-Nlog记录到文本

    Dynamic CRM插件中记录日志的方式有多种 通常情况下分为ITracingService记录.单独日志表插入记录.文本记录三种. 之前整理过ITracingService记录的方式,但这种记录有 ...

  2. Dynamic CRM 2013学习笔记(二)插件基本用法及调试

      插件是可与 Microsoft Dynamics CRM 2013 和 Microsoft Dynamics CRM Online 集成的自定义业务逻辑(代码),用于修改或增加平台的标准行为.也可 ...

  3. Dynamic CRM 2013学习笔记(二十三)CRM JS智能提示(CRM 相关的方法、属性以及页面字段),及发布前调试

    我们知道在CRM的js文件里引用XrmPageTemplate.js后,就可以实现智能提示,但每个js文件都引用太麻烦了,其实可以利用vs的功能让每个js文件自动实现智能提示CRM的js: 另外,我们 ...

  4. Dynamic CRM 2013学习笔记(一)插件输入实体参数解析

      1. 问题描述 最近新建了一个post事件的插件,传入的参数处理如下: 1: if (context.InputParameters.Contains("Target") &a ...

  5. Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具

    基本上每个实体form上都会有单据编号,而且不同的实体编号要求还不太一样,这时就需要一个通用的单据编号插件,可配置以应对不同的需求. 下面简单介绍下实现步骤: 1. 创建二个实体,以保存各实体所要求的 ...

  6. Dynamic CRM 2013学习笔记(十二)实现子表合计(汇总,求和)功能的通用插件

    上一篇 Dynamic CRM 2013学习笔记(十一)利用Javascript实现子表合计(汇总,求和)功能 , 介绍了如何用js来实现子表合计功能,这种方法要求在各个表单上添加js方法,如果有很多 ...

  7. Dynamics CRM 客户端的插件调试

    Dynamics CRM 客户端的插件调试 一直以来,Dynamics CRM插件在大家的印象中都是不便于调试的,根据官方文档(http://technet.microsoft.com/zh-cn/l ...

  8. Dynamic CRM 2013学习笔记(二十二)插件里调用WCF服务

      1. 添加service:     2.调用WCF BasicHttpBinding myBinding = new BasicHttpBinding(); myBinding.Name = &q ...

  9. Dynamic CRM 2013学习笔记 系列汇总

    这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...

随机推荐

  1. WPF 查找控件的所有子控件

    /// <summary> /// 查找子控件 /// </summary> /// <typeparam name="T">控件类型</ ...

  2. OpenCV学习笔记(二) - 写入视频、jpg格式

    写入视频: import sys, os import cv2 imgDir = '/Users/xxx/salient/' videoName = 'vname' fps = 30 #帧频 outp ...

  3. [转载]Oracle日期周详解IW

    1 ORACLE中周相关知识描述 1.1           日期格式化函数 TO_CHAR(X [,FORMAT]):将X按FORMAT格式转换成字符串.X是一个日期,FORMAT是一个规定了X采用 ...

  4. Python数据分析Pandas库之熊猫(10分钟一)

    pandas熊猫10分钟教程 排序 df.sort_index(axis=0/1,ascending=False/True) df.sort_values(by='列名') import numpy ...

  5. vue-cli3使用webpack-spritesmith配置雪碧图

    一.背景问题 项目中如果有大量的小图标,如果不使用阿里的iconfont.UI给一个加一个,加一个引用一个,每个图标虽然很小,但是也是一次请求,每次请求都是消耗性能资源的. 二.解决思路 使用webp ...

  6. rsync如何不指定密码文件

    平时用rsync做数据同步时,都是通过--password-file指定一个密码文件 这个密码文件权限要求比较高,一般是600,属主属组都是rsync命令执行者 如果是在脚本中执行rsync,比如定时 ...

  7. ps top 命令

    pstree :显示进程树 ps: a:查看和终端有关的进程 u:显示进程是哪个用户启动的 x:和终端无关 ps aux |head 进程的分类: 和终端有关 和终端无关 进程状态: D:不可中断睡眠 ...

  8. ubuntu Fcitx 输入法 选择 黑框问题 解决方案

    在虚拟机装了个xubuntu,弄好fcitx 输入法后,打字时看不到选择框,被黑框折腾的不行,后来了一个方法,暂时解决了问题. 用 killall fcitx-qimpanel 结束 fcitx-qi ...

  9. Linux直播推流

    Linux系统实现youtube推流直播 系统:centos-7 软件:FFMPEG, youtube-dl 1. 安装FFMPEG 创建并cd到一个目录,下载最新的FFMPEG(下面是64位,32位 ...

  10. python 字典操作提取key,value

    python 字典操作提取key,value dictionaryName[key] = value 1.为字典增加一项  2.访问字典中的值  3.删除字典中的一项  4.遍历字典  5.字典遍历的 ...