如何重构用IOrganizationService替换OrganizationServiceProxy的方法

时间:2019-05-29 20:12:36

标签: c# dynamics-crm crm fakexrmeasy

我正在尝试重构代码,以便可以使用fakexrmeasy进行单元测试。

作为所建议的here重构的一部分,我试图将IOrganizationService传递到我的所有类和方法中。但是,我的某些类使用IOrganizationService没有的变量和方法,例如Timeout。我正在尝试寻找一种重构方法以使用IOrganizationService而不丢失功能。

这是重构前的样子。

class testClass () {

    public void testMethod(OrganizationServiceProxy service) {
        service.Timeout = new TimeSpan(0, 15, 0);
    }

}

这是在重构之后。 我尝试将IOrganizationService强制转换为OrganizationServiceProxy,但是伪造的服务上下文无法处理此强制转换。引发异常。

class testClass () {

    public void testMethod(IOrganizationService service) {
        var serviceProxy = (OrganizationServiceProxy) service; //This breaks when given a fake context
        service.Timeout = new TimeSpan(0, 15, 0);
    }

}

我已尝试使用this post中建议的IOrganizationServiceFactory。问题是factory.CreateOrganizationService()生成的是IOrganizationService,而不是OrganizationSeriviceProxy。

如何在不丢失功能的情况下重构使用IOrganizationService而不是OrganizationServiceProxy?我猜我可能必须以某种方式将IOrganizationService实现为OrganizationServiceProxy。

4 个答案:

答案 0 :(得分:1)

两个选项:

1)为简单起见,请重构您的代码,使其仅引用IOrganizationService,并且仅在测试中使用该代码,并保留未经测试的TimeOut位(超出重构函数的范围)

2)如果必须非常确实地进行单元测试Timeout属性,请模拟您自己的OrganizationServiceContext类,并将FakeXrmEasy(IOrganizationService)生成的模拟服务传递给OrganizationServiceProxy的构造函数。这是所有可用的构造函数的列表:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.xrm.sdk.client.organizationserviceproxy.-ctor?view=dynamics-general-ce-9

答案 1 :(得分:0)

像这样可行吗?

public class OrganizationServiceProxy : IServiceProxy
  {
    public int SomeProp
    {
      get
      {
        return 1;
      }

      set
      {
      }
    }

    public TimeSpan Timeout
    {
      get
      {
        return new TimeSpan();
      }

      set
      {
      }
    }

    public void SomeMethod()
    {
    }
  }
  public interface IServiceProxy : IOrganizationService
  {
    TimeSpan Timeout { get; set; }
  }

  public interface IOrganizationService
  {
    void SomeMethod();
    int SomeProp { get; set; }
  }

由于OrganizationServiceProxy实现了IServiceProxy(后者又实现了IOrganizationService),因此您可以检查传入的对象是否实现了IServiceProxy接口,并在if中进行工作。

private void testMethod(IOrganizationService someService)
{
   if(someService is IServiceProxy)
   {
     IServiceProxy tempProxy = someService as IServiceProxy;
     tempProxy.Timeout = new TimeSpan();
   }
}

答案 2 :(得分:0)

我不确定这是否有帮助,但这就是我所使用的

CrmServiceClient c = new CrmServiceClient(connectionstring); //various parameters available
(OrganizationServiceProxy) service = c.OrganizationWebProxyClient ?? c.OrganizationServiceProxy;

答案 3 :(得分:0)

我认为有一个简单的解决方案-如果您不需要在OrganizationServiceProxy上模拟方法-只需在单元测试上下文中忽略这些方法即可。

I.E。代替

// This breaks when given a fake context
var serviceProxy = (OrganizationServiceProxy) service;
serviceProxy.Timeout = new TimeSpan(0, 15, 0);

var serviceProxy = service as (OrganizationServiceProxy);
// The serviceProxy is null so it is ignored when given a fake context
if (serviceProxy != null)
{
   serviceProxy.Timeout = new TimeSpan(0, 15, 0);
}