Свойство «Объект» для смоделированного объекта на самом деле не является экземпляром класса, который вы пытаетесь смоделировать.
Цель макета - иметь возможность заменить объект, от которого зависит метод, который вы пытаетесь проверить.
Представьте, что ваш SettingsFactory выполняет очень дорогие операции, такие как, например, доступ к сети, базе данных или файловой системе. Вы не хотите, чтобы ваш тест имел доступ к этим дорогим ресурсам, поэтому вы создаете макет. Я был бы что-то вроде этого:
public class ClassThatUsesSettingsFactory
{
private readonly SettingsFactory _settingsFactory;
public ClassThatUsesSettingsFactory(SettingsFactory settingsFactory)
{
_settingsFactory = settingsFactory;
}
public void MethodThatCallsSettingsFactory()
{
//... do something
var settings = _settingsFactory.CreateOrGetSettings();
//... do something
}
}
Таким образом, вы можете заменить SettingsFactory на макет вашего юнит-теста следующим образом:
[TestMethod]
public void MakeSureSettingsFactoryIsCalled()
{
var settingsFactoryMock = new Mock<SettingsFactory>();
settingsFactoryMock.Setup(f => f.CreateOrGetSettings(), Times.Once).Verifiable();
var subjectUnderTest = new ClassThatUsesSettingsFactory(settingsFactoryMock.Object);
subjectUnderTest.MethodThatCallsSettingsFactory();
settingsFactoryMock.Verify();
}
Этот модульный тест в основном только проверяет, что метод CreateOrGetSettings вызывается один раз и только один раз, когда выполняется MethodThatCallsSettingsFactory.
Что делает Moq, так это создает другой класс с другой реализацией своего виртуального метода, который, скорее всего, установит флаг в true после его вызова, а затем проверит значение этого флага в методе «Проверка».
Здесь есть что понять, поэтому я надеюсь, что это достаточно ясно, поскольку вы упомянули, что у вас нет большого опыта работы с Moq.