在CRM 2011插件中模拟IOrganizationService.Execute的问题

Bry*_*ver 3 c# unit-testing moq dynamics-crm-2011

我还是嘲笑的新手,我在使用这段代码时遇到了麻烦:

//create the request
SendEmailFromTemplateRequest emailUsingTemplateReq = 
   new SendEmailFromTemplateRequest
   {
       Target = email,
       TemplateId = new Guid("07B94C1D-C85F-492F-B120-F0A743C540E6"),
       RegardingId = toParty[0].PartyId.Id,
       RegardingType = toParty[0].PartyId.LogicalName
   };

//retrieve response
SendEmailFromTemplateResponse emailUsingTemplateResponse =
    (SendEmailFromTemplateResponse)service.Execute(emailUsingTemplateReq);

var emailId = emailUsingTemplateResponse.Id;
Run Code Online (Sandbox Code Playgroud)

到目前为止,我没有遇到过模拟IOrganizationService的问题,但我对execute方法做错了.根据sdk,Execute方法返回一个需要强制转换为正确响应类的OrganizationResponse对象.这是我到目前为止所尝试的:

var idResults = new ParameterCollection();
idResults.Add("Id", Guid.NewGuid());

mockOrganizationService
  .Setup(os => os.Execute(It.IsAny<SendEmailFromTemplateRequest>()))
  .Returns(new OrganizationResponse
  {
      Results = idResults,
      ResponseName = "SendEmailFromTemplate",
  });
Run Code Online (Sandbox Code Playgroud)

当我尝试运行测试时,我不断收到无效的强制转换异常.我想我必须设置错误的响应对象.有人可以向我解释模拟IOrganizationService.Execute方法的正确方法吗?

cce*_*lar 6

您的方法是正确的,但您使用了错误的响应类型.该服务返回结果OrganizationResponse(这是所有响应的基类).您尝试将基本类型转换为特定类型.这不起作用.

您只需返回一个实例SendEmailFromTemplateResponse即可使您的代码正常工作.

var orgService = new Mock<IOrganizationService>();

var idResults = new ParameterCollection
{
   {"Id", Guid.NewGuid()}
};

orgService.Setup(s => s.Execute(It.IsAny<SendEmailFromTemplateRequest>()))
                       .Returns(new SendEmailFromTemplateResponse
{
   Results = idResults,
   ResponseName = "SendEmailFromTemplate"
});
Run Code Online (Sandbox Code Playgroud)