Moq не будет пытаться использовать вашу реализацию, и на самом деле ничего о ней не знает (даже не волнует, существует ли она). Вместо он генерирует свой собственный класс во время выполнения , который реализует ваш интерфейс ISomething
. И его реализация - это то, что вы настраиваете для использования методов something.Setup()
.
Если вы пропустите его настройку, он просто вернет значение по умолчанию и больше ничего не будет делать. Например,
var something = new Mock<ISomething>();
var result = something.Object.method(); // returns NULL
var somethingElse = new Mock<ISomething>();
somethingElse.Setup(s=>s.method()).Returns("Hello World");
var otherResult = somethingElse.Object.method(); // Returns "Hello World"
Установки могут быть довольно сложными, если вам это необходимо, в том числе возвращать разные результаты для разных аргументов или для разных вызовов (при первом возврате одно значение, при втором вызове - другое). Для более подробной информации вы можете проверить документация .
Обратите внимание, что something.Object
и somethingElse.Object
- это совершенно разные реализации (классы) интерфейса ISomething
. Вы можете проверить это по телефону:
var whatMySomethingIs = something.Object.GetType();
var whatMySomethingElseIs = somethingElse.Object.GetType();