Moq: Могу ли я поменять местами поведение моделируемого члена / свойства и поведение немодулированного члена / свойства? - PullRequest
1 голос
/ 07 марта 2012

Я хочу использовать один экземпляр фиктивной библиотеки, которую я использую в тестовом классе, однако, для некоторых тестов, я могу захотеть смоделировать одну из функций-членов, чтобы сделать / вернуть имитированное поведение / возвращаемое значение; для других тестов мне может понадобиться немодированная (нативная) функциональность библиотеки. Есть ли способ поменять местами между программой установки в одном экземпляре (смоделированное поведение) и "UNSetup" (немодированное поведение) в другом?

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Нет встроенного механизма для этого, но частичная имитация позволяет вам делать то же самое (с некоторыми ограничениями). 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());
1 голос
/ 09 августа 2012

как насчет:

MyMock.CallBase = true;

для любого ненастроенного метода реальная реализация называется ...

...