本文介绍了如何做CRM 2011的插件我正确地安装C#单元测试?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

想调试,2011年CRM的插件可以是非常困难的。不仅有具有在服务器上的正确位置.pdb文件的问题,但每次你做出改变编码你去通过部署和重新注册插件的麻烦。由于触发器是在CRM本身,它很难为它创建一个单元测试。



我现在写单元测试一个全新的插件的过程相当缓慢,错误,但是是这样的:




  1. 使用SDK插件注册工具注册新的插件

  2. 一个调试器附加到w3wp.exe的,把一个破发点中的插件代码。

  3. 通过触发任何操作它注册为运行该插件。

  4. 当破发点被击中,序列化的原像,postimage和目标管道输送到XML文件的价值,这便成为输入到我的单元测试。

  5. 停止调试并创建一个新的单元测试,使用RhinoMocks的嘲笑PluginExecutionContext和的ServiceProvider,使用装载序列化的XML文件作为存根的输入参数。

  6. 创建是那些获得在开始和结束时运行的方法该重置(第一尝试删除,然后添加)为单位测试过程的伪数据的每个单元测试的,则删除在试验结束时的伪数据。

  7. 编辑的序列化文件引用伪数据,这样我可以确保该插件将工作对完全相同的数据每次跑的时间。

  8. 声明并实例在单元测试插件,在嘲笑的对象传递

  9. 执行插件,运行其他查询,以确保该插件进行我期待的工作,断言失败。



这是一个痛苦的事情。从得到的图像正确,创建伪数据,并且每个测试运行时间重置它,似乎有改善了很多区域。



我怎么能单元测试,而无需真正从CRM触发它,或通过CRM调试它先,创造了独特的虚拟数据的所有喧闹运行插件每个测试?如何使用注射消除了需要被删除,创建,测试,验证,并在CRM删除数据的每个单元测试?



更新2016年



这问题是仍然得到了不少命中,所以我想我想补充一下两(据我所知)开源项目的单元测试提供假CRM实例:




  • - 创建者霍尔迪(请参阅下面的回答)


    • 主要假CRM服务

    • 对插件的支持/工作流伪造

    • 在FakeItEasy依赖



  • 的 - 由我自己创建


    • 假CRM服务+以上(假设,实体建筑商等)

    • 的插件/工作流伪造流利的支持

    • 不依赖任何模拟框架

    • 苏茨基文档(我的工作就可以了)




结帐的我创造了比较和对比的差异。


解决方案

With mocking. See this link for what classes to mock with RhinoMocks. Sounds like you are on your way in this regard.

Injecting values for the input parameters can be done by stubbing in a hand-cranked instance of the entity you are going to manipulate:

// Add the target entity     
Entity myStubbedEntity = new Entity("account");
// set properties on myStubbedEntity specific for this test...
ParameterCollection inputParameters = new ParameterCollection();     
inputParameters.Add("Target", myStubbedEntity);     
pipelineContext.Stub(x => x.InputParameters).Return(inputParameters); 

Isnt that easier than capturing the xml data and rehydrating the entire input parameters collection?


EDIT:for data access the usual recommendation is to wrap data access into classes. The repository pattern is popular but overkill for what we need here. For your plugins execution classes, you "inject" your mocked class at creation. A blank constructor that initalizes the default repository, and a second constructor that takes an IRepository.

public class MyPluginStep
{
    ITaskRepository taskRepository;
    public MyPluginStep(ITaskRepository repo)
    {
        taskRepository = repo;
    }
    public MyPluginStep()
    {
        taskRepository = new DefaultTaskRepositoryImplementation();
    }
    public MyExecuteMethod(mypluginstepparams){
        Task task = taskRepository.GetTaskByContact(...);
    }

Depending on the complexity of your plugin steps this can evolve into passing many repositories to each class and could become burdensome but this is the basics you can add complexity to if required.

这篇关于如何做CRM 2011的插件我正确地安装C#单元测试?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 10:41