Как провести рефакторинг метода для замены OrganizationServiceProxy на IOrganizationService - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь реорганизовать свой код, чтобы выполнить модульное тестирование с использованием fakexrmeasy.

Как часть предложенного рефактора, упомянутого здесь , я попытался передать 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);
    }

}

Я пытался использовать IOrganizationServiceFactory, как предложено в в этом посте . Проблема заключается в том, что factory.CreateOrganizationService () создает IOrganizationService, а не OrganizationSeriviceProxy.

Как я могу реорганизовать использование IOrganizationService вместо OrganizationServiceProxy без потери функциональности? Я предполагаю, что мне, возможно, придется каким-то образом реализовать IOrganizationService в качестве OrganizationServiceProxy.

Ответы [ 3 ]

0 голосов
/ 30 мая 2019

Я не уверен, поможет ли это, но это то, что я использовал

CrmServiceClient c = new CrmServiceClient(connectionstring); //various parameters available
(OrganizationServiceProxy) service = c.OrganizationWebProxyClient ?? c.OrganizationServiceProxy;
0 голосов
/ 31 мая 2019

Я думаю, что есть простое решение - если вам не нужно высмеивать методы над OrganizationServiceProxy - просто игнорируйте их в контексте модульного тестирования.

т.е. вместо

// 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);
}
0 голосов
/ 29 мая 2019

Может ли что-то подобное быть жизнеспособным?

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, и выполнять свою работу внутриесли.

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