J'ai lu (et relu) Martin Fowler se moque de ne Stubs. En cela, il définit deux approches différentes de la TDD: "Classique" et "Mockist". Il tente de répondre à la question "dois-je Donc être un classique ou un mockist?", mais il admet qu'il n'a jamais essayé mockist TDD sur "rien de plus que des jouets." J'ai donc pensé que je voudrais vous poser la question ici. Les bonnes réponses peut répéter Fowler arguments (mais je l'espère plus clairement) ou ajouter des arguments qu'il n'a pas pensé ou que d'autres sont venus avec depuis Fowler dernière mise à jour de la rédaction de retour en janvier 2007.
Réponses
Trop de publicités?Je ne pense pas que vous avez besoin de choisir l'un sur l'autre. Les deux ont leurs avantages et leurs inconvénients, et les deux sont des outils pour votre boîte à outils. "Mockist" ats vous rend un peu plus souple dans ce que vous pouvez tester tout classique TDD fait vos tests un peu moins fragiles, car ils ont tendance à regarder de plus au niveau de l'entrée/de sortie vs au lieu de regarder la mise en œuvre effective. Lorsque vous faites mockist unité de test, nous semblent avoir plus de tests de rupture lors de la modification de la mise en œuvre.
J'essaie d'utiliser classique tdd chaque fois que possible (bien que j'utilise souvent un moqueur de cadre pour définir les talons rapidement). Parfois, je remarque que je commencer à faire des tests trop à un moment ou j'ai besoin de trop d'objets à mettre en place un test. C'est à ce moment mockist les tests peuvent souvent vous aider à fixer des petits tests.
C'est tout à fait abstraite, donc j'espère que je sens
La question sur mockist ou classique tdd est très bien sur quelle partie de votre demande, vous effectuez le test. Si vous avez un "standard" de l'architecture en couches (comme DDD par exemple), la couche domaine est généralement adapté pour classique tdd où vous test de l'unité par la mise en place de l'objet sous test, appelez quelques méthodes et vérifier le résultat et/ou de l'état.
A l'inverse quand vous faites des tests de services d'application, les contrôleurs ou de la logique de présentation qui tous de faire plus de la coordination des travaux, en se moquant ou stubbing est souvent nécessaire pour obtenir de bons tests. Mon expérience est aussi que ces classes ont tendance à appeler d'autres couches (webservice, datalayer,...) qui vous voulez vraiment de se moquer ou de stub. Ces tests ont aussi besoin de plus de code de programme d'installation de sorte que vous devrait seulement se moquer quand il le faut.
Mon conseil est d'aller classique dès que vous le pouvez et de se moquer quand vous devez.
Vous pourriez envisager de consulter notre livre, à http://www.growing-object-oriented-software.com/ . Il comprend un exemple travaillé étendu. Au fur et à mesure que nous l'écrivions, nous avons découvert que la distinction entre l'état et l'interaction est largement trompeuse et qu'il s'agit davantage d'une approche de la conception OO.
Une approche très pragmatique a été exposée par Sandi Metz:
Un objet peut communiquer à d'autres objets par le biais de sortants ou entrants les messages. Les messages peuvent être des requêtes (renvoie somethings) ou de commandes (s'exécute quelque chose).
Il y a quatre combinaisons. Sortant les messages de requête ne doit être testé (déjà testé que la réception de la requête de la classe externe), Vous pouvez utiliser le mockist méthode de test sur sortant les messages de requête et les tests classiques pour le reste. Vérifier les liens
http://jnoconor.github.io/blog/2013/10/07/the-magic-tricks-of-testing-by-sandi-metz/
https://speakerdeck.com/skmetz/magic-tricks-of-testing-ancientcityruby
Je suis encore relativement nouvelle au TDD - mais la façon dont on m'a appris/mis en place pour les différences était de penser en termes de tests de l'intégration entre les classes et de sorte que vous ne sont pas dépendants des données en direct. Par exemple si j'ai une classe qui est à peu près autonome - ne dépend pas des autres classes que j'ai construit pour un projet, et il ne veut pas aller à un live de données/environnement de dev pour l'entrée (comme un DB ou une API d'un système) ensuite, je tiens seulement à l'utilisation classique des tests unitaires en quelque chose comme NUnit ou JUnit - mais quand je commence à tester l'interaction entre le bâti classes - c'est à ce moment qu'il peut obtenir réel à portée de main, à se moquer des autres classes personnalisées et/ou à l'extérieur de l'interaction, de sorte que vous pouvez sélectionner et de tester votre actuelle des classes de code sans chercher à poursuivre un bug potentiel dans d'autres classes que vous appelez.