Question

Donc, je suis en train de travailler sur un code existant qui est lourd sur le manuel des opérations de base de données.Je suis d'essayer de maintenir un semblant de qualité ici, donc je vais TDD autant que possible.

Le code je suis en train de travailler sur les besoins à remplir, disons, d'une List<Foo> à partir d'un DataReader qui retourne tous les champs requis pour un fonctionnement Foo.Cependant, si je veux vérifier que le code, en fait, retourne un élément de la liste par une ligne de base de données, je suis en train d'écrire le code de test qui ressemble à quelque chose comme ceci:

Expect.Call(reader.Read()).Return(true);
Expect.Call(reader["foo_id"]).Return((long) 1);
// ....
Expect.Call(reader.Read()).Return(true);
Expect.Call(reader["foo_id"]).Return((long) 2);
// ....
Expect.Call(reader.Read()).Return(false);

Ce qui est assez fastidieux et assez facilement cassé, trop.

Comment dois-je aborder cette question, de sorte que le résultat ne sera pas un énorme gâchis de fragile tests?

Btw, je suis actuellement à l'aide de Rhino.On se moque, mais je peux le changer si le résultat est assez convaincant.Aussi longtemps que l'alternative n'est pas TypeMock, parce que leur CLUF était un peu trop effrayant pour mes goûts dernière, j'ai vérifié.

Edit:Je suis aussi actuellement limitée à C# 2.

Était-ce utile?

La solution

Pour rendre cela moins fastidieuse, vous aurez besoin pour encapsuler/refactoriser le mappage entre le DataReader et l'Objet que vous tenez dans la liste.Il est tout à fait de quelques étapes pour encapsuler que la logique.Si c'est la route que vous voulez prendre, je peux poster le code pour vous.Je ne suis pas sûr à quel point il serait de poster le code ici sur StackOverflow, mais je peux donner un coup de feu pour les garder clairs et concis.Sinon, vous êtes coincé avec la fastidieuse tâche qui consiste à répéter chaque attente sur l'index de l'accesseur pour le lecteur.Le processus d'encapsulation permettra également de se débarrasser des chaînes de caractères et les chaînes de plus réutilisable grâce à vos tests.

Aussi, je ne suis pas sûr à ce point combien vous voulez faire le code existant plus testable.Puisque c'est le code de legs que ce n'était pas construite avec des tests à l'esprit.

Autres conseils

J'ai pensé à poster du code, et puis je me suis souvenu à propos de JP Boodhoo est Rien Mais .NET cours.Il a un exemple de projet qu'il est le partage qui a été créé lors d'une de ses classes.Le projet est hébergé sur Google Code et c'est une belle ressource.Je suis sûr qu'il a quelques bons conseils pour vous d'utiliser et de vous donner des idées sur la façon de revoir la cartographie.L'ensemble du projet a été construit avec ATS.

Vous pouvez mettre les Foo cas dans une liste et de comparer les objets avec ce que vous lisez:

var arrFoos = new Foos[]{...}; // what you expect
var expectedFoos = new List<Foo>(arrFoos); // make a list from the hardcoded array of expected Foos
var readerResult = ReadEntireList(reader); // read everything from reader and put in List<Foo>
Expect.ContainSameFoos(expectedFoos, readerResult); // compare the two lists

Kokos,

Quelques choses de mal là.Tout d'abord, faire de cette façon signifie que je dois construire le Foos d'abord, puis de nourrir leurs valeurs à la maquette lecteur qui ne fait rien pour réduire la quantité de code que j'ai écris.Deuxièmement, si les valeurs de passer par le lecteur, les Foos de ne pas être la même Foos (référence à l'égalité).Ils pourraient être l'égalité des, mais encore, ce n'est en supposant que trop la classe Foo que je n'ose pas toucher à ce point.

Juste pour clarifier, vous voulez être en mesure de tester votre appel en SQL Serveur a renvoyé des données, ou si vous avez des données que vous pouvez mapper dans le modèle?

Si vous voulez tester votre appel dans SQL retourné des données de la caisse trouvé ma réponse ici

@Toran:Ce que je suis en essais est du programme de cartographie de données retournées par la base de données pour, je cite, " modèle de domaine.Donc je veux pour se moquer de la connexion de base de données.Pour l'autre type de test, j'irais pour tous les tests d'intégration.

@Benoît:Je suppose que vous avez cloué assez bien là, et j'avais peur que ce pourrait être le cas.Si vous avez des pointeurs vers des articles ou d'autres choses de ce genre où quelqu'un a fait le sale boulot, et décomposée en plus facilement digestibles étapes, je l'apprécierais.Les exemples de Code ne ferait pas de mal non plus.Je n'ai aucune idée sur la façon d'aborder ce problème, mais avant que je n'ose le faire, je vais avoir besoin de trouver d'autres choses à faire, et si les tests qui nécessitent fastidieux moqueur, alors que c'est ce que je vais faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top