Dynamics CRM 2011编程系列(42):Plugin的单元测试(Rhino Mocks)

    大家在编写程序的时候都会对程序进行单元测试,以此来检测程序是否完成了期望的功能。在实施Dynamics CRM 2011 的过程中会大量使用Plugin程序,但是Plugin程序的调试过程比较繁琐。相信大家对Plugin调试都比较头痛,往往因为一些语法问题折腾半天,难道就没有什么方法可以释放咱们的双手么?还好咱们有Rhino Mocks :D

    Rhino Mocks 是款单元测试工具,用它来做程序的单元测试可以省去大量的时间。它的用法大家可以参考文章《单元测试利器:Rhino Mocks》。接下来我们就来看看怎么用它来测试Plugin程序吧:

 

 Dynamics CRM 2011编程系列(42):Plugin的单元测试(Rhino Mocks)_第1张图片

图1

Dynamics CRM 2011编程系列(42):Plugin的单元测试(Rhino Mocks)_第2张图片

图2

Dynamics CRM 2011编程系列(42):Plugin的单元测试(Rhino Mocks)_第3张图片

图3

Dynamics CRM 2011编程系列(42):Plugin的单元测试(Rhino Mocks)_第4张图片

图4

Dynamics CRM 2011编程系列(42):Plugin的单元测试(Rhino Mocks)_第5张图片

图5

 

 AccountPlugin代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

using Microsoft.Xrm.Sdk;


namespace AccountPlugin
{
    public class AccountPlugin:IPlugin
    {
        private Entity curEntity;
        private Regex PhoneRegex = new Regex(@"^\d{11}$", RegexOptions.Compiled);
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = factory.CreateOrganizationService(null);
            

            if (context.InputParameters.Contains("Target"))
            {
                curEntity = (Entity)context.InputParameters["Target"];
            }




            if(!PhoneRegex.IsMatch((string)curEntity["telephone1"]))
            {
                throw new InvalidPluginExecutionException("电话号码格式输入错误");
            }
            

        }
    }
}


 

单元测试代码

[TestMethod]
        public void CreateAccount()
        {
            IServiceProvider serviceProvider = MockRepository.GenerateMock<IServiceProvider>();
            IPluginExecutionContext context = MockRepository.GenerateMock<IPluginExecutionContext>();
            IOrganizationServiceFactory factory = MockRepository.GenerateMock<IOrganizationServiceFactory>();
            IOrganizationService service = MockRepository.GenerateMock<IOrganizationService>();
            Entity account = MockRepository.GenerateMock<Entity>();
            ParameterCollection paramBag = new ParameterCollection();


            account.Attributes.Add("telephone1", "15310102987");
            paramBag.Add("Target", account);
            paramBag.Add("Id", Guid.NewGuid());

            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);
            

            AccountPlugin.AccountPlugin plugin = new AccountPlugin.AccountPlugin();
            plugin.Execute(serviceProvider);

            

        }


小结

   用Rhino Mocks对插件进行单元调试能排除大部分的语法错误及大量的低级错误,可以为我们节省大量的调试时间。当然这篇文章只是起到抛砖引玉的效果,咱们完全可以用Rhino Mocks创建一个功能强大的Plugin单元测试库。

代码下载

 

你可能感兴趣的:(Dynamics CRM 2011编程系列(42):Plugin的单元测试(Rhino Mocks))