Quelles sont les différences entre les mocks et les stubs sur Rhino Mocks?


149

Je n'ai pas assez joué avec ça et j'utilise habituellement des simulations, mais je me demande quelles sont les différences entre ces deux et quand utiliser l'un ou l'autre sur Rhino Mocks.

Mettre à jour:

J'ai également trouvé la réponse à ma question dans les mots d'Ayende :

La différence entre les stubs et les mocks

Vous pouvez obtenir la définition réelle de ces termes dans cet article: Les mocks ne sont pas des stubs . Je veux me concentrer sur la différence du point de vue de Rhino Mocks.

Un simulacre est un objet sur lequel on peut fixer des attentes, et qui vérifiera que les actions attendues se sont bien produites. Un stub est un objet que vous utilisez pour passer au code sous test. Vous pouvez y définir des attentes, de sorte qu'il agirait de certaines manières, mais ces attentes ne seront jamais vérifiées. Les propriétés d'un stub se comportent automatiquement comme des propriétés normales et vous ne pouvez pas leur définir d'attentes.

Si vous souhaitez vérifier le comportement du code testé, vous utiliserez une simulation avec l'attente appropriée et vous le vérifierez. Si vous souhaitez simplement transmettre une valeur qui peut devoir agir d'une certaine manière, mais qui n'est pas l'objet de ce test, vous utiliserez un stub.

IMPORTANT: un stub n'entraînera jamais l'échec d'un test.


Réponses:


148

Selon ceci

... En termes simples, il existe une différence entre les objets Mock et Stub et RhinoMocks reconnaît que cela nous permet d'écrire des tests qui définissent mieux leur objectif.

Les objets simulés sont utilisés pour définir les attentes, c'est-à-dire: Dans ce scénario, je m'attends à ce que la méthode A () soit appelée avec tels ou tels paramètres. Se moque d'enregistrer et de vérifier ces attentes.

Les stubs, quant à eux, ont un but différent: ils n'enregistrent ni ne vérifient les attentes, mais nous permettent plutôt de «remplacer» le comportement, l'état du «faux» objet pour utiliser un scénario de test ...


J'ai trouvé un autre article utile qui fait écho au même message que la réponse acceptée pour cette question - martinfowler.com/articles/mocksArentStubs.html .
singh1469

20

De manière générale, les tests unitaires appellent des fonctions et des méthodes, puis vérifient si le comportement attendu s'est produit. Ces fonctions et méthodes peuvent nécessiter des paramètres. Nous utilisons des stubs et des simulacres pour satisfaire ces paramètres. On peut parfois aussi se moquer des objets globaux.

Bouts

Un stub est un petit objet faux que votre test peut utiliser comme paramètre pour faire fonctionner l'appel de fonction. Cela nous permet de vérifier le comportement de la fonction testée. Cela ne nous permet pas de vérifier les effets secondaires, car le stub n'a pas d'implémentation.

Mocks

Un Mock est un stub avec une implémentation. Si notre fonction testée interagit avec notre objet fictif, nous pouvons vérifier que la fausse a été interagie comme prévu.

Par exemple, supposons que nous ayons un objet User fictif et que nous voulions vérifier que notre méthode session.login fonctionnait, nous pourrions vouloir vérifier que user.lastLoggedIn a été défini. Nous pourrions créer un utilisateur simulé qui implémente cette méthode. Lorsque nous appelons session.login, nous pouvons affirmer que user.lastLoggedIn a l'état que nous attendions.

Pour résumer

Une maquette est un stub avec une implémentation, qui nous permet de tester les effets secondaires.

Cette différence est-elle toujours importante?

Tout comme la différence entre les comparaisons et les métaphores, la différence entre les stubs et les mocks est subtile et historique, et a peut-être plus à voir avec les différentes communautés et philosophies dans le monde des tests que toute différence technique majeure.

Ils représentent des approches légèrement différentes des tests. Une maquette peut être écrite comme un talon. Un stub peut généralement être développé en une maquette.

Lequel devriez-vous utiliser?

Vous constaterez peut-être que vous commencez par créer des stubs, puis plus tard, vous constaterez peut-être que vous devez créer des simulations complètes pour certains de vos objets. Vous voudrez peut-être vous moquer de tout au fur et à mesure, ou vous voudrez peut-être simplement vous moquer si nécessaire.


7

Différence entre Mock et stub: avec stub, vous corrigez l'entrée de votre test unitaire: ainsi votre test unitaire ne fait pas d'assertion sur le stub et le stub en réécrivant l'implémentation d'une méthode corrigeant le comportement d'un faux objet. avec Mock, vous fixez la sortie de votre test unitaire: ainsi votre test unitaire fait une attente sur votre objet Mocking en vérifiant l'interaction interne dans votre objet fictif.


Vous semblez dire que votre test devrait "vérifier" la sortie d'un simulacre. Si c'est ce que vous dites, vous vous trompez. Un simulacre n'est pas censé être testé; il est là pour que vous puissiez tester un autre code. Ou votre dernière phrase signifie-t-elle autre chose?
Andrew Barber

1
Salut Andrew, comme je l'ai écrit Avec Mock, vous corrigez la sortie de votre test pour ne pas le tester.Sinon, j'ai écrit que Mock vous permet de vérifier l'interaction (comportement d'attente ... ;-)
Hassan Boutougha

1
D'accord, cela a plus de sens. Merci pour la clarification!
Andrew Barber

> ne fait pas d'assertion sur le stub Pourquoi, dans de nombreuses bibliothèques d'assertions, il existe encore des méthodes aka should have been called withpour affirmer des stubparamètres.
hellboy

5

Dans le cas du framework Moq - la méthode de configuration est STUB où comme méthode de vérification est Mock


0

Une chose que j'ai également remarquée est que lorsque j'utilise MockRepository.GenerateMock, je dois définir explicitement des attentes sur un appel de méthode spécifique pour intercepter cet appel. Avec les stubs, il semble intercepter automatiquement n'importe quelle méthode tant qu'elle est virtuelle.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.