如何正确设置CRM2011插件的C#单元测试?尝试在CRM2011中调试插件非常困难。不仅将.pdb文件放在服务器上的正确位置会有问题,而且每次更改代码时,都会遇到部署和重新注册插件的麻烦。由于触发器在CRM本身中,因此很难为其创建单元测试。我目前为一个全新的插件编写单元测试的过程是相当缓慢和错误的,但是是这样的:使用SDK插件注册工具注册新插件将调试器附加到w3wp.exe,在插件代码中添加一个断点。通过注册运行的任何操作触发插件。当命中断点时,管道的原像、后像和目标值被序列化为一个XML文件,然后成为我的单元测试的输入。停止调试并创建一个新的单元测试,使用RhinoMocks模拟PluginExecutionContext和ServiceProvider,使用序列化的XML文件作为输入参数的存根。创建在每个单元测试的开始和结束时运行的方法,重置(首先尝试删除,然后添加)正在处理的单元测试的虚拟数据,然后在测试结束时删除虚拟数据。编辑序列化文件以引用虚拟数据,以便我可以确保插件每次运行时都针对完全相同的数据工作。在单元测试中声明并实例化插件,传入模拟对象以执行插件,运行其他查询以确保插件执行我期望的操作,断言失败。这是一件痛苦的事情。从获取正确的图像到创建虚拟数据并在每次测试运行时重置它,似乎还有很大的改进空间。我如何才能对插件进行单元测试,而不必实际从CRM触发插件,或者先在CRM中调试它的所有环节,并为每个测试创建唯一的虚拟数据?我如何使用注入来消除在每个单元测试中删除、创建、测试、验证和删除CRM中的数据的需要?2016更新这个问题仍然有很多点击率,所以我想我会添加两个(我知道的)开源项目,它们为单元测试提供假CRM示例:XrmUnitTest-由我自己创建查看我创建的视频以进行比较和对比差异。我如何才能对插件进行单元测试,而不必实际从CRM触发插件,或者先在CRM中调试它的所有环节,并为每个测试创建唯一的虚拟数据?带着嘲讽。有关使用RhinoMocks模拟的类,请参阅此链接。听起来你在这方面正在努力。我如何使用注入来消除在每个单元测试中删除、创建、测试、验证和删除CRM中的数据的需要?注入输入参数的值可以通过存入要操作的实体的方便实例来完成://添加目标实体EntitymyStubbedEntity=newEntity("account");//在myStubbedEntity上设置特定于此测试的属性。..ParameterCollectioninputParameters=newParameterCollection();inputParameters.Add("目标",myStubbedEntity);pipelineContext.Stub(x=>x.InputParameters).Return(inputParameters);它比捕获xml数据并重新集成整个输入参数集更容易吗?编辑:对于数据访问,通常的建议是将数据访问包装到一个类中。存储库模式很流行,但对于我们在这里需要的东西来说有点过分了。对于您的插件执行类,您在创建时“注入”您的模拟类。用于初始化默认存储库的空白构造函数和用于获取IRepository的第二个构造函数。公共类MyPluginStep{ITaskRepositorytaskRepository;publicMyPluginStep(ITaskRepositoryrepo){taskRepository=repo;}publicMyPluginStep(){taskRepository=newDefaultTaskRepositoryImplementation();}publicMyExecuteMethod(mypluginstepparams){Tasktask=taskRepository.GetTaskByContact(...);}根据插件步骤的复杂性,这可能会演变为将许多存储库传递给每个类,并且可能会变得很麻烦,但如果需要,您可以在基础上增加复杂性。我将插件执行上下文序列化为一个文件以进行单元测试。codeplex上有一个很好的项目可以做到这一点http://crm2011plugintest.codeplex.com/使调试和单元测试更容易,您可以“记录”真实世界的测试。一个非常好的选择是使用一个mock库来为你处理mocking和fakes,因为我想创建我自己的并且总是浪费很多时间来创建fakes或mocks,直到我创建这个库来为你做这件事。试试FakeXrmEasy以上是C#学习教程:HowtoproperlysetupC#unittestingforCRM2011plugin?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
