2011-02-16 3 views
3

Quelle est la meilleure façon d'écrire des tests unitaires lorsque je suis limité à des entités EF 3.5?Testing Entity Framework 3.5

+0

Qu'essayez-vous de tester un appareil? Pouvez-vous fournir plus d'informations sur ce que vous essayez de faire ou avez des problèmes? – Jeff

Répondre

0

Si vous essayez de tester vous-même vos requêtes, je vous recommande fortement de configurer une base de données de test et de la tester avec des données réelles. Utiliser IObjectSet<T> afin de substituer une collection en mémoire pour vos tests unitaires à exécuter est une idée BAD. Il y a des différences entre la façon dont une requête linq est exécutée sous linq-to-objects, et la façon dont elle est analysée dans une commande T-SQL, à savoir dans la façon dont les nulls sont gérés. Par exemple,

db.People.Where(p => p.AccountNum == variable); 

Si c'est l'utilisation d'objets LINQ to (comme dans un objet de mémoire que vous avez mis en couche sous-jacente en remplacement de IObjectSet<T> pour vos tests unitaires) puis qui se déroulera parfaitement. Si toutefois vous utilisez une base de données que contre, alors si la variable est nulle, votre requête soufflerait, car une requête de

WHERE [peopleTableAlias].[AccountNum] = @param1 

sera généré, avec @ param1 étant nulle, qui sera sans valeur, puisque vous vraiment besoin d'une requête IS NULL générée.


Si toutefois vous voulez tester votre logique métier, qui appelle votre EF datacontext, alors je dirais pour conclure ces requêtes en objets DataAccess, marquez vos méthodes comme virtuelle, injecter dit OTI où ils sont nécessaires , et dans vos tests unitaires, remplacez les deux méthodes par des méthodes manuelles qui remplacent ces méthodes pour retourner la valeur désirée pour vos tests, ou faites la même chose avec votre cadre de simulation préféré (par exemple, Rhino).

EDIT - désolé, IObjectSet<T> est limité à EF4, que vous n'avez pas, évidemment. Mais puisque l'utilisation de cela pour vos tests unitaires est quelque chose que je recommande pas faire, la réponse devrait toujours s'appliquer.

+0

La classe que je vais tester est une DAL. Donc, la mise en place d'un test de DB semble être la bonne façon de procéder. Avez-vous de bons conseils sur l'utilisation d'un db de test ou tout ce dont j'ai besoin de connaître? – Ols1

+0

L'essentiel est de nettoyer après vous après chaque test, de sorte que les données d'un test n'interfèrent pas avec le suivant. Vous pouvez évidemment supprimer manuellement vos données de test entre les tests, mais j'ai également lu à propos de l'utilisation d'un TransactionScope pour entourer votre test, puis de le supprimer au lieu de le valider après le test pour empêcher les données de coller à la base de données . Je n'ai jamais essayé cela, donc je ne peux pas dire comment ça marche –

Questions connexes