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
.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire cela avec:
Le code ci-dessus la mise en œuvre de MyNetworkStream pour toute méthode/propriété qui n'est pas explicitement de l'installation. I. e. il appelle le réel Method2(), tandis que le Method1() sera moqué de version.
CallBase=true
est généralement destiné à tester les classes abstraites (si cela est bon ou mauvais, est hors de la portée de cette question).MyNetworkStream
implémenteMethod1
par une méthode publique qui n' pas pour lavirtual
(ouabstract
ouoverride
) modificateur, pouvez-vous encore l'installation de ceMethod1
sur unMock<MyNetworkStream>
?Dans ce cas (sauf si il y a beaucoup plus de choses), je voudrais juste créer mon propre test de classe étendant la classe avec le réel problème, qui implémente l'interface, vous avez besoin de se moquer. De cette façon, vous pouvez vous moquer de la valeur de un, et de secours de la classe de base de la fonctionnalité réelle.