Exigences Moq?Défait le but?
-
28-10-2019 - |
Question
Le fait d'être obligé de virtualiser tous les accesseurs de propriété que vous voulez vous moquer ne va-t-il pas à l'encontre du but de la moquerie?
Je veux dire, si je dois modifier mon objet et virtualiser chaque accessoire dont je veux me moquer, ne pourrais-je pas aussi bien hériter de ma classe et me moquer d'elle moi-même?
La solution
Votre question est très valable mais si vous y réfléchissez, il n'y a pas d'autre moyen de se moquer d'une classe. Si vous prenez une interface, ce n'est qu'un contrat, donc le framework simulé peut se moquer de la façon dont vous le souhaitez, mais si vous prenez une classe, il a déjà une implémentation pour ses membres.
Ainsi, le framework fictif, pour pouvoir se moquer des membres de la classe, doit hériter de la classe et remplacer le comportement du membre comme demandé et à cette fin, seuls les membres virtuels fonctionneront.
Par exemple. si vous avez (je montre des méthodes mais la même chose est vraie pour les propriétés)
class Foo
{
public void Bar()
{
}
public virtual void virtualBar()
{
}
}
alors le framework fictif crée probablement quelque chose comme ça pour se moquer
public class MockFoo : Foo
{
public override void virtualBar()
{
// mockery action
}
public new void Bar()
{
// mockery action
}
}
Maintenant, quand vous avez
Foo foo = GetMockObject(); // you get an instance of MockFoo
maintenant lorsque vous appelez
foo.Bar();
vous n'avez pas l'intention qu'il appelle l'implémentation réelle, mais comme il s'agit d'un membre non virtuel, il appellera le Foo
du Bar()
d'autre part, appeler
foo.VirtualBar();
appellerait MockFoo
de VirtualBar()
car c'est un membre virtuel qui aurait le comportement injecté par le framework fictif comme demandé.