2010-05-02 4 views
6

J'ai quelques classes de référentiel qui sont destinées à parler à différents types de données, dérivant d'une interface IRepository. Dans les implémentations, le code parle à une source de données, qu'il s'agisse d'un répertoire de fichiers XML ou d'une base de données ou même simplement d'un cache. Est-il possible de tester de manière fiable toutes ces implémentations? Je ne vois pas de mise en œuvre fictive, parce que je ne fais que tester le code simulé et non le code réel.Comment testez-vous un cours destiné à parler aux données?

Répondre

8

Non, vous utiliseriez un simulacre lorsque vous écriviez une classe qui utilise et IRepository. Pour les implémentations de IRepository, vous devez effectuer un test par rapport à la source de données appropriée. Pour les bases de données, c'est un peu pénible - pour un système de fichiers, un peu moins. Si possible, si vous pouvez exprimer votre implémentation en termes de flux ou de lecteurs, vous simplifiera la vie: les tests pour ces parties de l'implémentation peuvent aller à l'encontre des sources de données en mémoire ou des flux de ressources dans le test Assemblée. Bien sûr, vous aurez probablement besoin de certains tests qui vont à une base de données réelle ou le système de fichiers, mais j'espère que moins. Si vous appelez de tels tests «tests unitaires» ou non, c'est une question de définition des tests unitaires; Personnellement, je ne me soucie pas trop des noms impliqués, mais je me soucie d'avoir des tests. Pour les bases de données en particulier, celles-ci peuvent être quelque peu douloureuses (surtout si vous voulez pouvoir exécuter des tests en parallèle) - mais elles peuvent aussi être incroyablement précieuses, d'après mon expérience.

1

Je pense que si vous testez du code qui persiste ou interroge des données, vous voulez probablement utiliser une base de données.

Il s'agit de tests d'intégration plutôt que de tests unitaires.

Vous pouvez configurer une base de données de test, dans laquelle vous connaissez l'état des données, et exécuter les tests par rapport à cela. Vous voulez probablement dire aux tests qu'ils sont différents de vos tests unitaires et qu'ils n'ont pas besoin d'être lancés à chaque vérification (dans nUnit, vous pouvez décorer votre classe de test avec un attribut lui interdisant de s'exécuter)

1

parlant, vous ne unité tester tout code dont le seul but est de parler à une source de données. Vous pouvez toujours vouloir tester automatiquement le référentiel, mais un tel test sera par définition un test d'intégration. Vous ne voulez probablement pas exécuter ces tests dans le cadre de vos builds "first pass", par exemple. la mise en place de la base de données et le nettoyage après vous-même peuvent prendre un temps non négligeable.

Si votre référentiel a d'autres responsabilités (par exemple, l'implémentation du modèle Unité de travail), vous pouvez tester ces unités séparément.

1

À un certain moment de l'implémentation de l'IRepository, vous utiliserez une API tierce qui va réellement lire/écrire dans/from database/file/xml. Ce que vous voulez faire est de se moquer de ces API pour s'assurer que votre code appelle la bonne API dans le bon ordre. Donc, si vous lisez depuis la base de données, vous pouvez simuler SqlConnection et SqlCommand et vous assurer que vous appelez les bonnes méthodes sur ces classes. Si vous écrivez dans un flux, vous pouvez simuler le flux et vous assurer de le vider et de le supprimer (par exemple).

Questions connexes