Rhino Mocks: Как заглушить общий метод, чтобы поймать анонимный тип?

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

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> () в тестируемом методе был выполнен с объектом как параметр типа, но на самом деле метод вызывается с типом анонимного типа. Этот тип недоступен вне тестируемого метода. В результате, заглушка никогда не вызывается.

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

Ответ 1

Я не понимаю вашего варианта использования, но вы можете использовать вспомогательный метод для настройки Stub для каждого теста. У меня нет 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
}

Ответ 2

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

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

class ProgressReporterMock : IProgressReporter
{
    T Report<T>(T progressUpdater)
    {
      return progressUpdater;
    }
}