Нет встроенного механизма для этого, но частичная имитация позволяет вам делать то же самое (с некоторыми ограничениями). Parial mock позволяет вам смоделировать конкретную реализацию интерфейса, а не только интерфейс, как это:
var partialMock = new Mock<ServiceImplementation>();
Ограничения состоят в том, что все методы, которые вы, возможно, хотите смоделировать, должны быть виртуальнымииначе Мок не может их перехватить:
public class ServiceImplementation
{
public virtual int SomeMethod()
{
return 5;
}
public virtual int SomeOtherMethod()
{
return SomeMethod()*2;
}
}
var partialMock = new Mock<ServiceImplementation>();
// we stub one method
partialMock.Setup(m => m.SomeMethod()).Returns(3);
// and use other's real implementation
var value = partialMock.Object.SomeOtherMethod();
Проблема, конечно же, заключается в виртуальности;в случае, если вы не можете сделать своих участников виртуальными, это явно не сработает.Тем не менее, есть небольшой обходной путь - используйте реальную реализацию как часть настройки заглушки:
// note we base our stub on interface now
var implementation = new ServiceImplementation();
var mock = new Mock<IServiceImplementation>();
// we call real implementation as part of return setup
mock.Setup(m => m.SomeMethod()).Returns(implementation.SomeMethod());