Rhino Mocks: Как заглушить универсальный метод для отлова анонимного типа? - PullRequest
11 голосов
/ 31 мая 2011

Нам нужно заблокировать универсальный метод, который будет вызываться с использованием анонимного типа в качестве параметра типа. Рассмотрим:

interface IProgressReporter
{
    T Report<T>(T progressUpdater);
}

// Unit test arrange:
Func<object, object> returnArg = (x => x);   // we wish to return the argument
_reporter.Stub(x => x.Report<object>(null).IgnoreArguments().Do(returnArg);

Это сработало бы, если фактический вызов .Report () в тестируемом методе был сделан с объектом в качестве параметра типа, но в действительности метод вызывается с T, являющимся анонимным типом. Этот тип недоступен за пределами тестируемого метода. В результате заглушка никогда не вызывается.

Можно ли заглушить универсальный метод без указания параметра типа?

Ответы [ 2 ]

5 голосов
/ 02 июня 2011

Я не совсем понимаю ваш вариант использования, но вы можете использовать вспомогательный метод для настройки заглушки для каждого теста. У меня нет RhinoMocks, поэтому я не смог проверить, будет ли это работать

private void HelperMethod<T>()
{
  Func<object, object> returnArg = (x => x); // or use T in place of object if thats what you require
  _reporter.Stub(x => x.Report<T>(null)).IgnoreArguments().Do(returnArg);
}

Затем в вашем тесте выполните:

public void MyTest()
{
   HelperMethod<yourtype>();
   // rest of your test code
}
0 голосов
/ 07 июля 2015

Чтобы ответить на ваш вопрос: нет, невозможно заглушить универсальный метод, не зная общих аргументов с Rhino.Обобщенные аргументы являются неотъемлемой частью сигнатуры метода в Rhino, и здесь нет «Any».

Самый простой способ в вашем случае - просто написать написанный от руки фиктивный класс, который обеспечивает фиктивную реализациюIProgressReporter.

class ProgressReporterMock : IProgressReporter
{
    T Report<T>(T progressUpdater)
    {
      return progressUpdater;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...