Использование Moq для универсальных методов - PullRequest
6 голосов
/ 11 июля 2011

Совершенно простая ситуация, но я не могу заставить ее работать.Я сталкиваюсь с проблемой использования Moq для макетирования универсального метода (в данном случае на интерфейсе Ninject Kernel):

T Get<T>();

Я установил свой фиктивный объект:

Mock<IKernel> mockKernel = new Mock<IKernel>();
        mockKernel.Setup(x => x.Get<IGetUserQuery>()).Returns(new GetUserQuery());

Во время выполнения я получаю следующее исключение:

Expression references a method that does not belong to the mocked object: x => x.Get<IGetUserQuery>(new[] {  })

Есть идеи, почему он это выбрасывает?Я без проблем издевался над дженериками в Moq ... Есть ли случаи, когда дженерики не поддерживаются?Это похоже на простой случай.Единственная проблема заключается в том, что IGetUserQuery в свою очередь наследует от обобщенного типа:

IGetUserQuery : ICommand<UserQueryInput, UserQueryOutput>

Я не вижу в этом проблемы, поскольку универсальные типы для этой реализации ICommand статически определяются IGetUserQuery, поэтому я сомневаюсьЭто сбивает с толку Moq.

Заранее спасибо

1 Ответ

5 голосов
/ 11 июля 2011

Проблема в том, что T Get<T> () на самом деле не метод, определенный в интерфейсе IKernel, это метод расширения, определенный здесь .

Почему вы пытаетесь насмехаться T Get<T> () на первом месте?Взаимодействие с контейнером IoC должно быть абсолютно минимальным, обычно только на «точке входа» вашей системы на верхнем уровне.

...