Moq подделать один метод, но использовать реальную реализацию другого

Учитывая интерфейсIService который имеетMethod1() а также .Method2()

Я хочу проверить это, когдаMethod1() бросает,ExceptionMethod2() называется ивозвращает заданное значение. (

Method2() называется когдаMethod1() броски).

Поэтому мне нужно проверить настоящийMethod2() с подделкойMethod1()они являются методами одного и того же интерфейса.

Вот мой тестовый код:

MBase sut.MethodX() является единственной точкой входа. Оно использует .IService

Моя цель - утверждать, чтоMethod2() возвращаетсячто-то.

// Arrange
// Fake bytes in.
var networkStreamMock = new Mock();
networkStreamMock.Method1(x => x.Read(It.IsAny(), It.IsAny(), It.IsAny())).Returns(It.IsAny());

// Force throw TimeoutException.
var mock = new Mock();
mock.Setup(x => x.Method1(new Message
{ 
    Xml = Xml,  
}
)).Throws();

// Check Method 2 is called. (this is done in its own test so commented out)
// mock.Setup(m => m.Method2(It.IsAny())).Verifiable();

// New MBase.
IKernel kernel = new StandardKernel(new FakeBindings());
kernel.Rebind().ToConstant(mock.Object);
MBase sut = kernel.Get();

// Act
sut.MethodX(networkStreamMock.Object);

// Here I would like to assert on the return value of Method2
mock.Verify(m => m.Method2(It.IsAny()));

Возможно ли это с помощью Moq или других фальшивых рамок? Как мне это сделать? Я могу создать ручной макет с поддельной реализациейMethod1() и реальная реализацияMethod2() но мне интересно, есть ли лучший подход.

Я уже тестировалIService в изоляции, но теперь я хочу проверить этоВзаимодействие с.MBase

Ответы на вопрос(2)

Ваш ответ на вопрос