2009-05-12 5 views

Répondre

3

Vous devez ajouter autant de mock que nécessaire pour isoler votre classe testée. Vous avez besoin d'un simulacre pour chaque dépendance qui ne devrait pas faire partie du test.

Parfois, vous mettez deux ou trois classes ensemble dans un test, par simplicité, car ils construisent quelque chose comme un composant et sont fortement couplés. Tout le reste devrait être moqué. Je connais cette «meilleure pratique» pour avoir un seul simulacre et ne le comprends pas non plus. Dans nos tests unitaires, nous avons beaucoup de simulacres, certains simulacres environnementaux sont mis en place par le cadre de test que j'ai écrit (par exemple, TransactionService, SecurityService, SessionService). Il n'y a qu'une seule chose à considérer, comme Gishu l'a déjà mentionné dans sa réponse, de nombreux faux-semblants sont une indication d'une forte dépendance. C'est à vous de considérer quand c'est trop. Nous avons beaucoup de petites interfaces, ce qui nécessite de nombreux tests de simulation.

Pour activer votre réponse autour, vous ne devriez pas une dépendance moquerai quand:

  • Il est une partie très couplée de la classe en cours de test, comme une classe interne, classe privée, etc.
  • C'est une classe de framework .NET commune comme une collection et autres
  • Vous voulez écrire un test d'intégration pour tester exactement l'interaction avec cette classe. (Vous vous moquez toujours de tout le reste et vous avez toujours des tests unitaires pour chaque classe impliquée dans l'isolement.)
  • Il est juste trop coûteux de se moquer d'une certaine classe. Soyez prudent en décidant que c'est trop cher, les simulacres semblent être difficiles à configurer, mais s'avèrent être un jeu d'enfant par rapport aux problèmes de maintenabilité que vous aurez avec l'utilisation de vraies classes. Mais il existe des cadres et des technologies qui ne sont pas implémentés par rapport aux interfaces et qui sont très difficiles à simuler. S'il est trop coûteux de placer ces classes de framework derrière votre propre interface, vous devez les utiliser dans les tests.
3

Je ne suis pas sûr de savoir de quels articles vous parlez, mais j'ai généralement un objet simulé par dépendance pour la classe à tester.

+0

"L'art du test unitaire" dit exactement cela. Testez seulement une chose par test, chaque fois que ce que signifie une chose n'est pas clair. –

5

Vous pouvez avoir plus d'un simulacre dans un test unitaire en fonction du contexte.

Cependant, je pense que 'les articles' pourraient être faisant allusion à est

    prévention des
  • sur-moqueur. Quand un test d'unité se moque de tous les collaborateurs, vous laissez la porte ouverte; le scénario peut échouer lorsque vous remplacez de vrais collaborateurs. En minimisant le nombre de faux-semblants et en utilisant de vrais collaborateurs autant que possible/possible, vous minimisez ce risque.
  • High Coupling alertes: Si vous devez vous moquer de beaucoup de collaborateurs pour écrire un test unitaire, il peut s'agir d'une odeur de conception indiquant que vous avez un couplage élevé.
+0

+1 pour l'indice de couplage.Mais je ne suggérerais pas d'utiliser de «vrais collaborateurs» uniquement pour réduire le nombre de faux-semblants. Parfois, vous testez plusieurs classes ensemble, car elles sont fortement couplées et construisent un composant. Mais tout ce qui est à l'extérieur devrait être isolé aussi bien que possible. Si vous trouvez que vous avez trop de mock, vous avez un problème de couplage. Ensuite, vous devriez refactoriser. –

+0

Je recommande d'utiliser des «vrais» collaborateurs non pas pour réduire le nombre de mocks .. mais pour faire fonctionner le miroir en mode réel. C'est pour éviter le cas où votre test passe parce que vous étiez en train de jouer avec un ensemble d'objets fantaisistes. Cependant, dans le monde réel, il ne fonctionne pas car l'une des dépendances n'agit pas comme le simulacre correspondant. Si le collaborateur ne ralentit pas le test unitaire, créer une interface à la limite, puis utiliser un simulacre est trop rapide. – Gishu

+0

@Gishu: Je ne suis pas d'accord. Les mocks sont pour l'isolation, pas pour la vitesse. Vous devez isoler le code testé aussi bien que possible, c'est comme un test de laboratoire en chimie, vous simplifiez l'environnement pour isoler un seul processus. Ensuite, vous pouvez prouver ce que fait le processus, indépendamment d'un environnement inconnu. Les simulacres doivent être triviaux et donc gérables. Les autres classes sont une autre inconnue. Ce que vous faites est également important, mais c'est un test d'intégration, que vous devriez faire après avoir prouvé que les classes individuelles se comportent selon les spécifications. –

Questions connexes