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;
}
}