Почему RhinoMocks обязывает переопределить ToString () явным образом, чтобы иметь возможность устанавливать на него ожидания? - PullRequest
3 голосов
/ 13 марта 2012

Я пытаюсь издеваться над ToString() вызовом моего пользовательского объекта. Я создал макет для интерфейса и установил ожидание на ToString() call

interface ICustomObject
{
}

var customObjectMock = MockRepository.GenerateMock<ICustomObject>();
var fakeDump = Guid.NewGuid().ToString();
customObjectMock.Expect(c => c.ToString()).Return(fakeDump).Repeat.Any();

Во время пробного запуска я получил исключение времени выполнения, говорящее:

System.InvalidOperationException: неверный вызов, последний вызов был использован или не было сделано (убедитесь, что вы звоните виртуальный (C #).

Общеизвестная ошибка, но почему я ее получил, учитывая, что ToString() является виртуальным?

И еще интереснее - я обошел это, просто определив ToString() явно в интерфейсе:

interface ICustomObject
{
  // Weird! I believe such method definition in interface would be confusing
  // without a special remark comment saying that this method is redefined 
  // to satisfy RhinoMocks (perhaps Reflection?)
  string ToString();
}

После этого RM позволяет установить ожидания на ToString().

Просто интересно, почему RinoMocks обязывает меня переопределить стандартное виртуальное Object.ToString()? Возможно, RM не рассматривает такие стандартные методы, которые доступны для каждого объекта Framework, и обязывает переопределять все методы / свойства явно, чтобы иметь возможность устанавливать ожидания?

1 Ответ

6 голосов
/ 13 марта 2012

Интерфейсы не являются объектами .

Несмотря на то, что вы можете неявно вызывать ToString() для интерфейса, предполагается, что существует некоторая object, которая реализует ваш интерфейс и, следовательно, неявно обеспечивает реализацию ToString().

Поскольку вы не предоставляете реализацию своего интерфейса, нечего «зацепить» метод ToString(), и, очевидно, RhinoMocks считает, что нет смысла тестировать метод, который нена самом деле существует.

...