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.