Как смоделировать методы расширения с Rhino Mock? - PullRequest
9 голосов
/ 21 октября 2010

У меня есть расширенные объекты типа IDataReader с некоторыми необходимыми мне методами расширения.Проблема теперь в том, что когда я пытаюсь смоделировать IDataReader, расширенный метод не включается в макет, поэтому, когда достигается строка Expect.Call(reader.ExtensionMethod()).Return(someValue), выполняется ExtensionMethod, что не то, что я хочу!Я хочу, чтобы этот вызов был записан, и когда метод расширения является вызовом из другого места, я хочу, чтобы он возвращал someValue.

Кто-нибудь знает, как обойти это?

Ответы [ 4 ]

15 голосов
/ 21 октября 2010

Раскрытие информации: я работаю на Telerik.

Методы расширения на самом деле являются статическими методами, скрытыми как методы экземпляра.RhinoMock не может макетировать статические методы, и вы никак не можете это сделать, если только вы не используете другую фиктивную библиотеку, которая использует профилировщик.

Такая библиотека JustMock от Telerik .

2 голосов
/ 28 октября 2010

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

0 голосов
/ 12 сентября 2017

В моем собственном примере я обернул методы расширения, которые мне пришлось заглушить, в методы вспомогательного класса, которые открывали методы-оболочки в новом интерфейсе. Я переключил свой производственный код, чтобы внедрить экземпляр этого вспомогательного класса, и изменил код для вызова новых методов. В модульных тестах вводится удобная заглушка интерфейса помощника.

Хотя это решение не является идеальным, оно все же менее драматично, чем обмен фреймворком.

0 голосов
/ 30 января 2015

Можно заглушить метод расширения или любой другой статический метод без какой-либо структуры.Следующий код позволяет вам сделать это, вам просто нужно заглушить _doSumm.

public static class MyExtensions
{
    public static Func<int,int, int> _doSumm = (x, y) => x + y;

    public static int Summ(this int x, int y)
    {
        return _doSumm(x, y);
    }
}
...