Как имитировать беглый интерфейс с Rhino mock

Ниже представлен удобный интерфейс:

public interface IReporter<in T,out TResult>
{
    IReporter<T, TResult> Add(T seed);
    TResult Prepare();
}

Использование в коде как:

строка errorReport = ErrorReporter.Add(Exception).Prepare();

Пробный тестовый пример:

        With.Mocks(mockRepository)
            .Expecting(() =>
                           {
                               Expect.Call(errorReporter.Add(null)).IgnoreArguments();
                               Expect.Call(errorReporter.Prepare()).Return(string.Empty);
                               Expect.Call(notifier.Notify(null)).IgnoreArguments().Return(true);
                           })
            .Verify(() =>
                        {
                            ITransporter transporter = new Transporter
                            {
                                ExpectedArgsLength = 1,
                                Notifiers = notifiers,
                                ErrorReporter = errorReporter
                            };
                            transporter.Run(new string[] { });
                        });

Ошибка:

Rhino.Mocks.Exceptions.ExpectationViolationException : IReporter`2.Prepare(); Ожидаемый №1, Фактический №0.

Если я прокомментирую Expect.Call(errorReporter.Prepare()).Return(string.Empty); тогда это работает, что не имеет смысла для меня.

Я что-то упускаю? Пожалуйста помоги!


person milind    schedule 30.11.2011    source источник
comment
Если я сломаю свой код следующим образом, тест пройдет нормально. ErrorReporter.Добавить(исключение); строка errorReport = ErrorReporter.Prepare(); И я не хочу ломать свой код   -  person milind    schedule 30.11.2011


Ответы (1)


Expect.Call(errorReporter.Add(null)).IgnoreArguments().Return(errorReporter);

вам нужно указать фиктивному объекту вернуть объект, который вы ожидаете от вызова Add, чтобы связать эти вызовы вместе. честно говоря, я удивлен, что он не завершается с ошибкой nullreferenceexception, когда Add возвращает null, а Prepare вызывается для нулевой ссылки.

person Dave Rael    schedule 30.11.2011