Насмешка над защищенным универсальным методом с помощью Moq - PullRequest
11 голосов
/ 23 февраля 2012

Чтобы смоделировать защищенный виртуальный (не универсальный) метод в Moq легко:

public class MyClass
{
....
      protected virtual int MyMethod(Data data){..}
}

И чтобы смоделировать его:

myMock.Protected().Setup<int>("MyMethod", ItExpr.Is<Data>( ...

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

protected virtual int MyMethod<T>(T data)

Любая идея, как это сделать, кроме использования класса-оболочки для переопределения этого метода, высоко ценится.

1 Ответ

6 голосов
/ 25 февраля 2012

Я проверил источник, и, похоже, защищенные от мошенничества обобщенные методы с Moq не поддерживаются :

Метод Protected() создает экземпляр класса ProtectedMock<T>, который использует следующий метод для получения метода, который вы хотите смоделировать:

private static MethodInfo GetMethod(string methodName, params object[] args)
{
    return typeof(T).GetMethod(
           methodName,
           BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public,
           null,
           ToArgTypes(args),
           null);
}

Он использует Type.GetMethod , чтобы получить метод для насмешки, но GetMethod (хотя MSDN по-разному) не очень хорошо работает с дженериками, см .:

GetMethod для универсального метода

Получить универсальный метод без использования GetMethods

Примечание: По моему мнению, издевательство над защищенным членом - это запах кода, и я бы все равно попытался избежать этого, если бы я подверг рефакторингу мой дизайн (кроме того, что он не поддерживается в Moq).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...