50 votes

Les faux sont-ils meilleurs que les Mocks ?

Je suis tombé sur ce projet open source Fake It Easy Je dois admettre que cela semble très intéressant, mais j'ai des doutes, quelle est la différence entre les faux de la FIE et, disons, les Moq Mocks ? Est-ce que l'un d'entre eux est meilleur pour des utilisations particulières ?

EDITAR:

En quoi ce nouveau cadre est-il meilleur que Moq, par exemple ?

93voto

Patrik Hägne Points 7735

Pour être clair, j'ai créé FakeItEasy donc je ne dirai certainement pas si un cadre est meilleur que l'autre, ce que je peux faire c'est souligner quelques différences et motiver pourquoi J'ai créé FakeItEasy. Sur le plan fonctionnel, il n'y a pas de différences majeures entre Moq et FakeItEasy.

FakeItEasy n'a pas de "vérifiable" ou d'"attentes", il a des assertions, cependant, celles-ci sont toujours explicitement indiquées à la toute fin d'un test, je crois que cela rend les tests plus faciles à lire et à comprendre. Cela aide également les débutants à éviter les assertions multiples (où ils définiraient des attentes sur de nombreux appels ou objets fantaisie).

J'ai utilisé Rhino Mocks auparavant et je l'ai bien aimé, surtout après l'introduction de la syntaxe AAA. J'ai cependant préféré l'API fluide de Moq. Ce que je n'aimais pas avec Moq était le "mock object" où vous devez utiliser mock.Object partout, je préfère l'approche de Rhino avec les mocks "naturels". Chaque instance ressemble et se sent comme une instance normale du type simulé. Je voulais le meilleur des deux mondes et je voulais aussi voir ce que je pouvais faire avec la syntaxe quand j'avais les mains absolument libres. Personnellement, je pense (évidemment) avoir créé quelque chose qui est un bon mélange du meilleur des deux mondes, mais c'est assez facile quand on se tient sur les épaules de géants.

Comme cela a été mentionné ici, l'une des principales différences réside dans la terminologie, FakeItEasy a été créé pour présenter TDD et mocking aux débutants et avoir à se soucier des différences entre mocks et stubs dès le départ (comme vous le feriez dans Rhino) n'est pas très utile à mon avis.

J'ai mis l'accent sur les messages d'exception, il devrait être très facile de savoir ce qui ne va pas dans un test en regardant simplement un message d'exception.

FakeItEasy possède quelques fonctionnalités d'extension que les autres frameworks n'ont pas, mais elles ne sont pas encore très bien documentées.

FakeItEasy est (on l'espère) un peu plus fort dans le mocking des classes qui ont des arguments de constructeur car il a un mécanisme pour résoudre les valeurs factices à utiliser. Vous pouvez même spécifier vos propres définitions de valeurs fictives en implémentant une classe DummyDefinition(Of T) dans votre projet de test, ceci sera automatiquement pris en compte par FakeItEasy.

La syntaxe est une différence évidente, le choix de la meilleure est en grande partie une question de goût.

Je suis sûr qu'il y a beaucoup d'autres différences que j'oublie maintenant (et pour être honnête, je n'ai jamais utilisé Moq en production moi-même, donc ma connaissance est limitée), mais je pense que ce sont les différences les plus importantes.

25voto

Adam Byrtek Points 5791

La terminologie utilisée dans les tests peut être légèrement déroutante. La meilleure source expliquant la différence entre les différents concepts est la suivante Les mocks ne sont pas des stubs par Martin Fowler. En résumé, faux est un terme générique qui décrit à la fois les stubs et les mocks.

11voto

Thomas Weller Points 8428

La terminologie du mocking peut prêter à confusion - et est parfois assez peu intuitive.

C'est pourquoi de nombreuses personnes ont proposé une nouvelle terminologie, plus simple, où vous n'avez que faux , mocks y souches .

Faux est le terme générique pour tous les types possibles de doubles de test, quelles que soient leur origine et leur utilisation.

Au-delà de ça, faux ne se distinguent que par une seule dimension : ils influencent ou non le résultat du test ; ou, en d'autres termes, vous devez définir des valeurs de retour pour le faux, qui sont utilisées d'une manière ou d'une autre pendant l'exécution du test, ou il s'agit d'une silencieux qui ne sert qu'à remplir une certaine dépendance.

Stub c'est que silencieux Objet.

Mock c'est participe activement dans l'exécution des tests

Au-delà de cela, il n'y a pas d'autre distinction - qui a sûrement ses mérites historiques, mais qui est maintenant largement contre-intuitive et académique, et qui obscurcit en quelque sorte les concepts vraiment importants du développement piloté par les tests.

En ce qui concerne la comparaison entre Moq y FakeItEasy les deux cadres sont en grande partie les mêmes d'un point de vue conceptuel - le Les différences se situent uniquement au niveau de l'API et de la terminologie. ...

Thomas

-3voto

M.Radwan -MVP Points 2255

De mon point de vue, Fake n'annule pas le Moc ; par exemple, j'utilise Dev Magic Fake pour simuler les couches DAL et Business et en même temps j'utilise Mock dans MVC pour HTTPContext.

var repoistory = new FakeRepository<ProductTypeForm, VendorForm>();
            repoistory.Save(productTypeForm);
            this.FillDropDown(new FakeRepository<VendorForm>());

Dans le code précédent, Dev Magic Fake va sauvegarder le ProductTypeForm et récupérer le VendorForm de Dev Magic Fake et le lier au ProductTypeForm, cette opération de sauvegarde peut être permanente.

Pour plus d'informations sur Dev Magic Fake, consultez le site CodePlex : http://devmagicfake.codeplex.com

Pour tester cette méthode, nous devons simuler le contexte HTTP.

var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();

Donc je travaille avec des faux et des simulacres

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X