Передача неинстанцированных классов и интерфейсов в универсальные методы - PullRequest
0 голосов
/ 04 мая 2018

Я унаследовал сотни таких утверждений:

mockKernel.Setup(x => x.Bind<IAddressService>().To<AddressService>())
          .Returns(new BindingConfigurationBuilder<AddressService>(bindingConfiguration, "ServiceName", mockKernel.Object));

... как часть тестов для сотен операторов, похожих на это:

_kernel.Bind<IAddressService>().To<AddressService>().InRequestScope();

Я хотел бы написать что-то вроде этого:

private void SetupBindAtoB<TInterface, TImplementation>(TInterface a, TImplementation b)
    where TImplementation : TInterface
{
  mockKernel.Setup(x => x.Bind<TInterface>().To<TImplementation>())
            .Returns(new BindingConfigurationBuilder<TImplementation>(bindingConfiguration, "ServiceName", mockKernel.Object));
}

... а затем назовите это так:

SetupBindAtoB(IAddressService, AddressService);

Но я не могу. Я должен передать реальный объект SetupBindAtoB, например:

SetupBindAtoB((IAddressService) null, (AddressService) null);

Можно ли избежать создания реальных объектов для передачи SetupBindAtoB?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

У вас есть два параметра аргумента, которые не используются (TInterface a и TImplementation b). Относятся только сами параметры типа (IInterface и IImplementation). Так что просто удалите ненужные параметры:

private void SetupBindAtoB<TInterface, TImplementation>()
    where TImplementation : TInterface
{
  mockKernel.Setup(x => x.Bind<TInterface>().To<TImplementation>())
            .Returns(new BindingConfigurationBuilder<TImplementation>(bindingConfiguration, "ServiceName", mockKernel.Object));
}

Затем вы можете вызвать метод следующим образом:

SetupBindAtoB<IAddressService, AddressService>();

В вашем подходе вы в основном полагаетесь на вывод типа из аргументов типов, который позволяет не указывать сами параметры типа. Обычно этот вывод типа делает вызов метода короче. В вашем случае это только усложняет:

SetupBindAtoB((IAddressService) null, (AddressService) null);

на самом деле является «сокращением» для

SetupBindAtoB<IAddressService, AddressService>(null, null);
0 голосов
/ 04 мая 2018

Вы пробовали это?

private void SetupBindAtoB<TInterface, TImplementation>()
    where TImplementation : TInterface
{
  mockKernel.Setup(x => x.Bind<TInterface>().To<TImplementation>())
            .Returns(new BindingConfigurationBuilder<TImplementation>(bindingConfiguration, "ServiceName", mockKernel.Object));
}

Использование

SetupBindAtoB<IAddressService,AddressService>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...