对于基于复杂的框架进行编程,最难的地方并不是编写代码,而是怎么快速有效的去调试出错的代码,怎么高效精准的完成代码的单元测试。就拿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