尝试在CRM 2011中调试插件非常困难。将.pdb文件放在服务器上的正确位置不仅存在问题,而且每次进行编码更改时,都会遇到部署和重新注册插件的麻烦。由于触发器是在CRM本身,因此很难为它创建单元测试。
我目前为一个全新的插件编写单元测试的过程相当缓慢且错误,但是这样的事情:
这是一件痛苦事。从获取图像正确,到创建虚拟数据,并在每次测试运行时重置它,似乎有很多需要改进的地方。
如何在不必从CRM实际触发插件的情况下对插件进行单元测试,或者首先运行在CRM中调试它的所有箍,并为每个测试创建独特的虚拟数据?如何使用注入来消除在CRM中为每个单元测试删除,创建,测试,验证和删除数据的需要?
这个问题仍然有很多点击,所以我想我会添加两个(我所知道的)开源项目,为单元测试提供Fake CRM实例:
Checkout this video我创建了比较和对比差异。
答案 0 :(得分:4)
我将插件执行上下文序列化为文件以用于单元测试。有一个关于codeplex的好项目可以执行此http://crm2011plugintest.codeplex.com/
使调试和单元测试更容易,您可以“记录”现实世界的测试。
答案 1 :(得分:2)
如何在不必从CRM实际触发插件的情况下对插件进行单元测试,或者首先运行在CRM中调试它的所有箍,并为每个测试创建独特的虚拟数据?
嘲笑。 See this link用于使用RhinoMocks模拟的类。在这方面听起来像你正在路上。
如何使用注入来消除在CRM中为每个单元测试删除,创建,测试,验证和删除数据的需要?
可以通过在要操作的实体的手摇实例中进行存根来注入输入参数的值:
// 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);
是否比捕获xml数据和重新整合整个输入参数集更容易?
编辑: 对于数据访问,通常的建议是将数据访问包装到类中。 repository pattern很受欢迎,但对于我们需要的东西来说太过分了。对于你的插件执行类,你可以在创建时“注入”你的模拟类。一个空白构造函数,用于初始化默认存储库,另一个构造函数用于获取IRepository。
public class MyPluginStep
{
ITaskRepository taskRepository;
public MyPluginStep(ITaskRepository repo)
{
taskRepository = repo;
}
public MyPluginStep()
{
taskRepository = new DefaultTaskRepositoryImplementation();
}
public MyExecuteMethod(mypluginstepparams){
Task task = taskRepository.GetTaskByContact(...);
}
根据插件步骤的复杂性,这可能会演变为将许多存储库传递给每个类,并且可能会变得很麻烦,但这是您可以根据需要增加复杂性的基础知识。
答案 2 :(得分:2)
一个非常好的选择是使用一个模拟库来处理模拟和假货,因为我想创建自己的模具库并且总是浪费很多时间创建假货或模拟,直到我创建这个库来执行它为了你。试试FakeXrmEasy