Moq faux, une méthode, mais l'utilisation réelle de la mise en œuvre d'une autre

Donné une interface IService qui a Method1() et Method2().

Je veux tester que lorsque Method1() jette un Exception, Method2() est appelée et renvoie une valeur donnée.

(Method2() est appelée lorsque Method1() lancers).

Donc j'ai besoin de tester une véritable Method2() avec un faux Method1(), ils sont des méthodes de la même interface.

Voici mon code de test:

MBase sut.MethodX() est le seul point d'entrée. Il utilise IService.

Mon objectif est d'affirmer que Method2() retourne quelque chose.

//Arrange
//Fake bytes in.
var networkStreamMock = new Mock<INetworkStream>();
networkStreamMock.Method1(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>())).Returns(It.IsAny<byte[]>());

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

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

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

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

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

Est-ce possible avec Moq ou d'une autre, se moquant de cadre? Comment dois-je faire?
Je peux créer un manuel de fantaisie avec une fausse mise en œuvre de Method1() et une réelle mise en œuvre de Method2() mais je me demande si il ya une meilleure approche.

J'ai déjà testé IService dans l'isolement, mais maintenant, je tiens à le tester c'est l'interaction avec MBase.

InformationsquelleAutor Sam Leach | 2013-09-27