Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重构方法以用IOrganizationService替换OrganizationServiceProxy_C#_Dynamics Crm_Crm_Fakexrmeasy - Fatal编程技术网

C# 如何重构方法以用IOrganizationService替换OrganizationServiceProxy

C# 如何重构方法以用IOrganizationService替换OrganizationServiceProxy,c#,dynamics-crm,crm,fakexrmeasy,C#,Dynamics Crm,Crm,Fakexrmeasy,我正试图重构我的代码,这样我就可以使用fakexrmeasy进行单元测试 作为前面提到的建议重构的一部分,我尝试将iorOrganizationService传递到我的所有类和方法中。但是,我的一些类使用IOOrganizationService没有的变量和方法,例如Timeout。我正试图找到一种重构的方法,以便在不丢失功能的情况下使用IOrganizationService 这就是它在重构之前的存在方式 class testClass () { public void testMe

我正试图重构我的代码,这样我就可以使用fakexrmeasy进行单元测试

作为前面提到的建议重构的一部分,我尝试将iorOrganizationService传递到我的所有类和方法中。但是,我的一些类使用IOOrganizationService没有的变量和方法,例如Timeout。我正试图找到一种重构的方法,以便在不丢失功能的情况下使用IOrganizationService

这就是它在重构之前的存在方式

class testClass () {

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

}
这是在重构之后。 我已尝试将IOOrganizationService强制转换为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);
    }

}
我已尝试使用IOrganizationServiceFactory,如中所建议。问题是,factory.CreateOrganizationService()生成的是IOOrganizationService,而不是OrganizationSeriviceProxy


如何重构以使用IOOrganizationService而不是OrganizationServiceProxy而不丢失功能?我猜我可能不得不以某种方式将IOrganizationService实现为OrganizationServiceProxy。

这样的方法可行吗

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(后者反过来实现了IOOrganizationService),您可以检查传入的对象是否实现了IServiceProxy接口,并在if中执行工作

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

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

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

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

即代替

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

两种选择:

1) 为了保持简单,重构代码,使其仅引用IOrOrganizationService,并且仅在测试中使用该代码,并保留未测试的超时位(在重构函数的范围之外)

2) 如果对Timeout属性进行单元测试确实是必要的,请模拟您自己的OrganizationServiceContext类,并将FakeXREasy(IOOrganizationService)生成的模拟服务传递给OrganizationServiceProxy的构造函数。以下是所有可用构造函数的列表:

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);
}