Дразнить интерфейс, который расширяет другой интерфейс, используя Moq - PullRequest
0 голосов
/ 09 сентября 2011

Hej Buddies!

Я пытаюсь создать макет для интерфейса, подобного приведенному ниже:

public interface ITheInterface: IEnumerable
{
...
}

Этими способами:

var theInterfaceMock = new Mock<ITheInterface>();
theInterfaceMock.Setup(x => x.OfType<SomeType>()).Returns(something);

и

var theInterfaceMock = new Mock<ITheInterface>();
theInterfaceMock.As<IEnumerable>();
theInterfaceMock.Setup(x => x.OfType<SomeType>()).Returns(something);

И в обоих случаях я получаю исключение System.NotSupportedException, которое в основном говорит мне, что у этого ITheInterface нет метода OfType () (когда он действительно есть).Кто-нибудь знает какой-либо способ решить эту проблему?.

Спасибо!

Ответы [ 4 ]

1 голос
/ 09 сентября 2011

OfType - это не метод в IEnumerable, это метод расширения, называемый Enumberable.OfType .

Вот почему Moq жалуется, я думаю.Поскольку это статические классы, я думаю, вам нужно использовать такой инструмент, как typemock .

Вопрос, однако, есть.Почему вам нужно издеваться над OfType ()?Вы можете верить, что Microsoft * реализация Enumberable.OfType работает.Поэтому просто смоделируйте интерфейс IEnumberable (GetEnumerator) и верните макет, поддерживающий IEnumerator, который будет использовать OfType.

0 голосов
/ 09 сентября 2011

Как уже сказал другой OfType - это не метод интерфейса IEnumerable. Тем не менее, вам не нужно издеваться над ним, все, что вам нужно, это смоделировать метод IEnumerable.GetEnumerator, который довольно легко сделать:


    var enumerable = new Mock<IEnumerable>();
    var something = new List<SomeType>
    {
        new SomeType(),
        new SomeType(),
        new SomeType(),
    };
    enumerable.Setup(_ => _.GetEnumerator()).Returns(something.GetEnumerator());

    Assert.That(enumerable.Object.OfType<SomeType>(), Is.EquivalentTo(something));

Вы просто перенаправляете метод GetEnumerator в одну из коллекций «что-то», и это все. Вы получите все методы расширения, работающие на макет автоматически.

0 голосов
/ 09 сентября 2011

Я считаю, что проблема в том, что OfType - это метод расширения. Поскольку Moq (и другие фреймворк-фреймворки) работают путем создания прокси-объектов / классов макетов интерфейсов, он имеет возможность только имитировать методы экземпляров. Методы расширения - это просто скрытые статические методы.

0 голосов
/ 09 сентября 2011

IEnumerable не имеет метода с именем OfType ... вы ищете IEnumerable?- Даже в этом случае OfType - это просто метод расширения , и вам придется высмеивать класс Enumerable и его статические члены.Я не думаю, что Moq может сделать это - извините.

Вот некоторые связанные вопросы (с возможными обходными путями): Как мне использовать Moq, чтобы высмеивать метод расширения? и Макет статического свойства с moq

...