Dynamics CRM 编程之单元测试技术: Microsoft Fake Framework

对于基于复杂的框架进行编程,最难的地方并不是编写代码,而是怎么快速有效的去调试出错的代码,怎么高效精准的完成代码的单元测试。就拿Dynamics CRM Plugin的编写来看,编写一个上千行代码的插件不是一件很难的事情,但是,如果把这上千行代码调试完成并让它行之有效的按我们的目的精准的进行呢?这也是初级技术员和高级技术员的核心差距。

今天给大家带来一篇关于Plugin的单元测试文章,博主2年前撰写过另外一篇类似的单元测试文档,使用的是Rhino Mock技术。但是今天我们要使用的技术,则是Microsoft Fake Framework技术。

什么是Fake Framework?是微软推出的一款功能强大的Unit Test Framework,它和Rhino Mock这些基于OOP概念的Tools有着根本的区别与优势。它能测试私有方法和重写系统框架的封闭代码,当然,其功能远不止于这些,大家有兴趣可以对其进行深入了解。

要对Dynamics CRM Plugin进行单元调试,需要解决的问题,当然是如何去模拟并构造IServiceProvider以及其包含的参数。对于这些知识,大家不必太过担心,可以参考下面给出的Demo

public IOrganizationService crmService;
        public IOrganizationServiceFactory crmServiceFactory;
        public IPluginExecutionContext context;
        public ITracingService tracing;
        public IServiceProvider serviceProvider;
        public Guid UserId = Guid.Empty;

        private const string CRM_SVC_PATH = "https://your server/XRMServices/2011/Organization.svc";
        private const string CRM_USERNAME = "account";
        private const string CRM_PASSWORD = "pwd";

        [TestInitialize]
        public void Startup()
        {
            crmService = CRMHelperV6.GetOrganizationServiceProxy(new Uri(CRM_SVC_PATH), AuthenticationProviderType.Federation, new string[] { CRM_USERNAME, CRM_PASSWORD }); //构造真是的CRM Proxy

            crmServiceFactory = new Microsoft.Xrm.Sdk.Fakes.StubIOrganizationServiceFactory()
            {
                CreateOrganizationServiceNullableOfGuid = (id) => { return crmService; }
            };

            serviceProvider = new System.Fakes.StubIServiceProvider()
                {
                    GetServiceType = (a)=>{
                        object result=new object();
                        if (a == typeof(IOrganizationServiceFactory))
                        {
                            result = crmServiceFactory;
                        }
                        else if (a == typeof(IPluginExecutionContext))
                        {
                            result = context;
                        }
                        if (a == typeof(ITracingService))
                        { 

                        }
                        return result;

                    }
                };

        }
        [TestMethod]
        public void CreateInvoiceDetailToXero()
        {

            Entity invoiceDetail = new Entity("invoicedetail");
            invoiceDetail.Attributes.Add("invoiceid", new EntityReference("invoice", Guid.Parse("{C1CCE633-D555-E511-8104-C4346BADD6F4}")));
            invoiceDetail.Attributes.Add("quantity", 2.0m);
            invoiceDetail.Attributes.Add("productid", new EntityReference("product", Guid.Parse("{6739BCB6-6EB4-E411-80DF-C4346BADE648}")));
            invoiceDetail.Attributes.Add("baseamount", new Money(1000));
            invoiceDetail.Attributes.Add("invoicedetailid", Guid.Parse("{D4E44A0F-E255-E511-8104-C4346BADD6F4}"));
            invoiceDetail.Attributes.Add("q2_synctoxero", true);

            ParameterCollection inputParameter = new ParameterCollection();
            inputParameter.Add("Target", invoiceDetail);

            context = new Microsoft.Xrm.Sdk.Fakes.StubIPluginExecutionContext()
            {
                InputParametersGet = () => { return inputParameter; }

            };

            CrmIntegrationPlugins.InvoiceDetailPlugin invD = new InvoiceDetailPlugin();
            invD.Execute(serviceProvider);

        }

在这里呢,我们首先构造了一个真实的CRM Proxy,并模拟了IServiceProvider以及其参数,大家当然还可以根据具体需要,模拟Target,PreImage和PostImage,模拟输入参数并根据具体业务进行具体的Mock处理。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-09 01:56:28

Dynamics CRM 编程之单元测试技术: Microsoft Fake Framework的相关文章

为了免费拿到微软的年底发布会的门票,只有厚着脸皮再写些 Microsoft Dynamics CRM 2013文章分享了

奔跑中的2015, 为了免费拿到微软的每年年底发布会的门票和IT相关的证书,没有办法,本人大专学历太低,最近本人所以在的城市政府有人才奖厉计划,就因要求本科及以上学历,都跟本人无缘了,所以只有厚着脸皮再写些 Microsoft Dynamics CRM 2013文章分享了,争取能在微软得到证书,肯定自已了. 前几个月在家里找到2012年的一张微软北京技术大会的门票,想想今年应该写点什么技术文章,再免费参加一次会议吧,想想写什么方面的呢,微软的office,server,数据库等专家太多了,写不过

利用K2和Microsoft Dynamics CRM构建业务App的5大理由

Microsoft Dynamics CRM提供了一个绝佳的客户关系管理平台,使您能够创建各种以客户为中心的解决方案.然而,通过将K2的企业业务流程功能与Microsoft Dynamics CRM相结合,您有机会构建为企业量身定制的业务应用程序.以下仅列举K2与Microsoft Dynamics CRM结合可为您带来的五大优势. 一.企业流程 Microsoft Dynamics CRM包含了一些流程功能,这些功能对于短暂的(几秒钟)实体操作流程来说至关重要,比如发布新信息时创建电话跟进流程

Microsoft Dynamics CRM MVP

MVP 一个响亮的名称, 不是 Kobe Bryant 不是 LeBron Raymone James 这是 Microsoft Dynamics CRM MVP 求证Link: http://mvp.microsoft.com/zh-cn/mvp/Earson%20Zhao-5001333 很开心写这篇Blog,从08年初开始接触MSCRM已经过了好多年,不知不觉中已经变成一位行业的老人,还可以拿到MVP. 目前可以跟全球的CRM MVP联系到,另外Microsoft CHINA MVP 也是

Step-by-Step Guide to Portal Development for Microsoft Dynamics CRM - 摘自网络

The Challenge Oftentimes in the world of Dynamics CRM, the need arises for non-CRM users to gain access to CRM data. A common solution is the implementation of a web portal which allows these users to perform certain actions on applicable CRM data. M

在VM虚拟机上安装Microsoft Dynamics CRM 2016 步骤图解及安装注意事项(转载)

本文转载 出处:http://www.cnblogs.com/lujiangping/archive/2016/06/02/5552443.html 安装Dynamics CRM 2016环境配置要求: 系统版本:Windows Server 2012 R2(必须) SQL 版本: SQLServer2014SP1-FullSlipstream-x64-ENU(必须) Dynamics CRM 版本:CRM2016-Server-ENU-amd64(必须) 安装步骤: 1.在虚拟机安装windo

Microsoft Dynamics CRM 2015 for Outlook 2010/2013 安装教程

Microsoft Dynamics CRM 2015 for Outlook 安装教程 注: 安装过程必须电脑要连上网,不然可能安装出错,最下面会总结出错log日记 . 查看下列视频: Microsoft Dynamics CRM 2015 中的 CRM for Outlook 配置: http://www.youtube.com/embed/4lAUXAiLId4  (此网站需要在国外或翻墙才能看) 如需看更详细的操作过程,可以访问以下网址: 微软官方详细介绍. https://techne

Microsoft Dynamics CRM 2013 /2015 配置之 添加 CRM 帐号和新建邮箱

在域服务器中建好帐号后,可以在exchange 2013 服务器中新建相关测试帐号的邮箱功能, 这样Microsoft Dynamics CRM 2015 for Outlook客户端就可以发挥作用了. 以下为新建邮箱步骤: 因为新建了二个帐号,所以在outlook 2013中,我们以管理员为例,添加邮箱功能, 好了,可以收邮箱了,下一步就可以安装 Microsoft Dynamics CRM 2015 for Outlook 2010/2013 客户端了,具体教程可以见:http://hang

Devlop Win 8 and Windows Phone App for Microsoft Dynamics CRM

Microsoft Dynamics CRM App for Windows Phone http://www.windowsphone.com/en-us/store/app/dynamics-crm/bdf6ad14-8ff3-4db1-a9d5-336c50ef13ee Microsoft Dynamics CRM App for Windows 8 http://apps.microsoft.com/windows/en-us/app/microsoft-dynamics-crm/937

Dynamices CRM JS 类库 神器 XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library

XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library http://xrmservicetoolkit.codeplex.com/documentation 特殊用法Create 和 Update { id: Id, logicalName: "new_entityname", type: "EntityReference" };       //Loo