Il y a quelque temps, j'ai lu sur une réponse de dépassement de pile que je ne trouve pas, une phrase qui expliquait que vous devriez tester des API publiques et que l'auteur a dit que vous devriez tester des interfaces. L'auteur a également expliqué que si une méthode de mise en œuvre a changé, il ne faut pas nécessiter de modifier le cas d'essai, comme cela permettrait de casser le contrat qui s'assurent que le système sous Test fonctionne. En d'autres termes, un test devrait échouer si la méthode ne fonctionne pas, mais pas parce que la mise en œuvre a changé.
Cela a appelé à mon attention lorsque nous parlons de moquer de la moqueur. Étant donné que la moqueur repose fortement sur les appels d'attente du système dans les dépendances du test, des moqueurs sont étroitement associés à la mise en œuvre plutôt qu'à l'interface.
Lors de la recherche -Mock VS Stub, plusieurs articles conviennent que ces talons devraient être utilisés à la place de maquillages, car ils ne s'appuient pas aux attentes des dépendances, ce qui signifie que le test n'a besoin aucune connaissance du système sous-jacent sous la mise en œuvre des tests.
Mes questions seraient:
Le principe ouvert/fermé est principalement de pouvoir modifier le comportement d'une classe sans la modifier. Par conséquent, injecter une dépendance de composants moquée dans une classe sous test ne le violent pas.
Le problème avec les tests doubles (simulactuel/talon) est que vous apportez essentiellement des hypothèses arbitraires concernant la manière dont la classe sous test interagit avec son environnement. Si ces attentes sont erronées, cela vous permet d'avoir des problèmes une fois que le code est déployé. Si vous pouvez vous le permettre, testez votre code dans les mêmes contraintes que celle qui borne votre environnement de production. Si vous ne pouvez pas, faites les moindres hypothèses possibles et que vous ne moquez que les périphériques de votre système (base de données, service d'authentification, client HTTP, etc.).
La seule raison valable pourquoi, IMHO, un double doit être utilisée, c'est lorsque vous devez enregistrer ses interactions avec la classe testée ou lorsque vous devez fournir de fausses données (que les deux techniques peuvent faire). Soyez prudent cependant, en abusant de cela reflète une mauvaise conception ou un test qui repose trop sur l'API sous la mise en œuvre des tests.