2011-06-05 3 views
3

Possible en double:
Hard-Coded Mock Objects vs Mocking Frameworkobjets pour moqueurs tests unitaires

Je pense que je commence enfin à comprendre ce que tests unitaires sont destinés à résoudre, mais ai encore du mal à mettre en œuvre tous les des détails. J'en suis venu à la conclusion que je pourrais avoir besoin d'un «faux» (et j'utilise ce terme à la légère puisque je ne suis pas sûr d'avoir besoin d'un objet complet comme Moq) pour faire le travail.

À titre d'exemple de la question que je suis en cours d'exécution pour, envisager une mise en œuvre du modèle référentiel (ou similaire). Si je comprends actuellement, je aurais besoin (au minimum) des tests pour chacun des Add(), Get() et Remove() méthodes de classe. Cela est bien, sauf que je veuille tester la façon dont les poignées méthode Add()null références. Dans ce cas, est-ce que je définirais simplement une classe simple dans le projet de test et définirais une instance de ceci à null dans le test unitaire approprié?

Exemple Test Unit (Illustration):

+0

Pourquoi ne pas simplement utiliser 'object'? –

+0

@Richard Szalay, ça marcherait tout de même. Mon intention avec l'utilisation de 'MockObject' était de faire connaître ma compréhension très limitée des objets fictifs et de l'utilisation prévue. Après avoir fait d'autres recherches, je commence à penser que 'MockObject' aurait dû être' StubObject'. Je suppose que je vais attendre et voir. –

Répondre

1

j'aller aussi loin que de dire que les tests de logiciels, est comme la matrice. Personne ne peut être dit ce que les tests de logiciels sont, vous devez le voir par vous-même. La plupart des non-croyants n'ont pas donné de chance aux tests et n'ont jamais essayé de faire des tests. Bienvenue au club!

La chose la plus délicate sur le test est bien qu'il est assez difficile d'écrire des tests, il est aussi parfois difficile d'écrire du code testable. Il existe cependant de nombreux outils et techniques qui vous permettront de devenir un meilleur ingénieur logiciel.

Mocks fournissent des mannequins que vous auriez autrement à vous écrire, se moque sont pratiques. Votre référentiel dans ce cas n'est pas un service de persistance réel dans ce cas, il fournit simplement un contrat avec lequel tester. Si l'ajout d'une référence nulle n'est pas supposé possible, vous devriez avoir un cas de test dans lequel une telle opération échoue. Je crois que cela va de soi, mais il est important de le tester.

Une bibliothèque, comme Moq pourrait être très utile ici, car un dépôt fictif ne fait rien et que vous voulez en fait une affirmation qui aura lieu ici. Je ne vois pas comment une propriété Entity après que quelque chose a été ajouté est nécessaire ici (autre que pour rendre plus facile d'écrire le test). Mais je pense aussi que c'est la mauvaise façon d'affirmer le comportement attendu.

Dans une certaine mesure ce que vous faites est en fait appelé les tests d'intégration parce que vous ne testez pas une unité isolée votre usine en utilisant une simulation pour tester l'interaction entre les deux composants. Ces types de tests sont très importants mais aussi difficiles à traiter s'ils ne sont pas conçus pour être testables. Et c'est pourquoi nous avons des choses telles que l'injection de dépendance.

Votre question ne nécessite pas vraiment une réponse spécifique, mais vous êtes sur la bonne voie et j'espère que cela vous donnera une idée et de la confiance supplémentaire lorsque vous faites des tests de logiciels.

+0

Merci pour les idées.Je suis allé de l'avant et ai fait quelques lectures sur Moq et je peux voir où cela serait utile pour, disons, le prototypage rapide (où chaque test équivaut plus ou moins à un pseudo-code exécutable) ainsi que des scénarios dans lesquels j'aimerais vérifier qu'un Le membre de l'objet fantaisie est appelé ou défini. Cependant, ce que je n'ai pas trouvé (et je pense que cela serait très utile dans de nombreux scénarios de test) était la possibilité de vérifier l'exécution d'instructions ou d'appels spécifiques dans les membres d'un objet fantaisie. –

+0

Pour développer cette idée ... Il serait bon de vérifier au moins qu'une instruction particulière de la méthode Add() est exécutée (ou plus vraisemblablement qu'un point de la routine est atteint) pour des valeurs non nulles (et vice versa). Cependant, je ne suis pas sûr que cette fonctionnalité n'est actuellement implémentée dans aucun framework (même si je l'ai peut-être manqué). –

+0

Il y a ces idiomes d'enregistrements/rejouements que Moq n'utilise pas et qui prétendent même ne pas être nécessaires, je n'ai pas regardé cela mais cela pourrait aussi être intéressant. –