Comment trouver la valeur qui a été transmise à une méthode sur mon interface fictive (Moq ou Rhino Mocks)?
-
05-07-2019 - |
Question
J'utilise Moq - mais je pourrais facilement passer à un autre modèle factice si nécessaire .
J'ai une interface définie:
public interface IBaseEngineManagerImp
{
void SetClientCallbackSender(IClientCallbackSender clientCallbackSender);
}
Je moque ensuite IBaseEngineManagerImp avec
mockEngineManagerImp = new Mock<IEngineManagerImp>();
EngineManager engineManager = new EngineManager(mockEngineManagerImp.Object);
engineManager appelle ensuite SetClientCallbackSender en transmettant une valeur.
Comment obtenir la valeur transmise à SetClientCallbackSender à partir de mon test unitaire?
(Je souhaite appeler des méthodes sur clientCallbackSender dans le cadre du test)
La solution
vous pouvez utiliser la méthode .Callback sur le modèle, pour appeler n'importe quelle fonction du paramètre qui a été transmise à la méthode SetClientCallbackSender:
mockEngineManagerImp.Setup(x => x.SetClientCallbackSender(It.IsAny<IClientCallbackSender>()))
.Callback((IClientCallbackSender c) => c.DoSomething());
Autres conseils
Dans rhino, vous utilisez WhenCalled
ou GetArgumentsForCallsmadeOn
:
Thingy argument;
mock
.Stub(x => x.SetClientCallbackSender(Arg<IClientCallbackSender>.Is.Anything))
.WhenCalled(call => argument = (Thingy)call.Arguments[0]);
// act
//...
// assert
Assert.AreEqual(7, argument.X);
Le problème avec cette implémentation est que vous ne récupérez que le dernier argument. Vous pouvez mieux contrôler cela en utilisant des contraintes d'argument (au lieu de Is.Anything).
ou
// act
//...
// assert
Thingy argument =
(Thingy)mock
.GetArgumentsFormCalsMadeOn(x => x.SetClientCallbackSender(
Arg<IClientCallbackSender>.Is.Anything))[0][0];
Le problème avec GetArgumentsFormCalsMadeOn
est qu’il renvoie un tableau à deux dimensions, une ligne pour chaque appel et une colonne pour chaque argument. Vous devez donc connaître exactement le nombre d'appels effectués par votre unité testée.