Comment Correctement des tests Unitaires des Opérations CRUD sur un Référentiel?

Réaliser ceci peut sembler comme une grande question - alors permettez-moi de préciser. J'ai un Référentiel exposés par l'intermédiaire d'une interface, avec deux des implémentations concrètes - un MockRepository et un EntityFrameworkRepository.

Maintenant, j'ai un Test Unitaire projet pour lequel tous les tests peuvent être exécutés contre soit référentiel, via pichenette sur une ligne [TestInitialize].

Ma question est fondamentalement "Comment dois-je écrire les tests".

Voici ce que j'ai:

C réer

//Arrange.
var foo = new Foo { .. };

//Act
Repository.Add(foo);
UnitOfWork.Commit();

//Assert
Assert.IsTrue(foo.Id > 0);

R etrieve

//Arrange.
var fooToGet = 1;

//Act
var foo = Repository.FindSingle(fooToGet);

//Assert
Assert.IsNotNull(foo);
Assert.AreEqual(foo.Id, fooToGet);

U pdate

//Arrange.
var fooToGet = 1;
var nameToChangeFooTo = "FooBar";

//Act
var foo = Repository.FindSingle(fooToGet);
foo.Name = nameToChangeFooTo;
UnitOfWork.Commit();
var fooRetrievedAgain = Repository.FindSingle(fooToGet);

//Assert
Assert.IsNotNull(foo);
Assert.AreEqual(fooRetrievedAgain.Id, fooToGet);
Assert.AreEqual(fooRetrievedAgain.Name, nameToChangeFooTo);

D elete

//Arrange.
var fooToGet = 1;

//Act
var foo = Repository.FindSingle(fooToGet);
Repository.Remove(foo);
UnitOfWork.Commit();
var fooRetrievedAgain = Repository.FindSingle(fooToGet);

//Assert
Assert.IsNull(fooRetrievedAgain);

Il travaille ok, pour à la fois la Fantaisie et de l'EF référentiel, mais mon principal problème est C (Create). Je ne suis pas sûr de la façon de tester une opération d'Ajout sur mon Référentiel. Il n'a pas sentir ce que im faire.

Il passe pour l'EF Référentiel, mais de le faire passer dans ma Maquette Référentiel, j'ai dû utiliser la réflexion pour mettre à jour l'ID dans la collection en mémoire (méchant).

Soi - pouvez-vous s'il vous plaît partager quelques conseils sur ce que sont les bonnes méthodes pour tester les opérations CRUD sur le Modèle de Référentiel?

C'est un ASP.NET Application MVC, .NET 4, C#, Entity Framework 4 et de l'Unité de Travail/Référentiel de Modèles.

Grâce.

MODIFIER

Juste pour clarifier les gars, ce ne sont pas des tous l'unité-les tests que j'ai. J'ai des tests unitaires pour ma couche de service, ainsi que les affaires de la règle de tests.

Fois ce dernier va (et doit) ne sont pas si mon ci-dessus Référentiel de tests échouent. C'est le point ici, à l'unité de test de la très opérations de base de mes Dépôts. Suis-je tort?

De quoi êtes-vous tester ici? Sent comme vous êtes des tests pour l'amour de l'écriture de tests.
en fait, j'ai écrit ces tests avant j'ai mis en place les référentiels (TDD). Vous dites que vous n'avez pas pris la peine de tester vos dépôts? Pensez à combien de 'sens' bugs seraient trouvées dans l'entreprise/les tests du système. Qui peut (et doit) être souligné lors d'un testrun avec un IC à construire. Ne pensez-vous pas?
Et n'oubliez pas, je suis en essais via interfaces. Repository est de type IRepository<Foo>. Je suis d'essayer de faire est de vous assurer de mes Dépôts sont en mesure d'effectuer des opérations de base sur un magasin de persistance (qui stockent en mémoire se moquer de pensions de titres, ou d'un objectif EF référentiel).
Dans mon expérience, je passe plus de temps à écrire dans la mémoire des implémentations et de traiter avec reproduisant les effets de la persistance ( en particulier concernant les Id ) que tout ce temps, je serais d'économiser en faisant en sorte GetById() renvoie un objet unique. Plus, car il semble que vous êtes réellement coder en dur les entités dans votre mémoire référentiels de vous lancer dans un "qui surveille le guetteur" scénario où votre tout simplement de le tester vous-même. Le test d'un ORM renvoie un objet par Id est aussi une blague. Pour moi son envie de tester ToString().
je suis en désaccord. Tout d'abord, en comparant le Référentiel, j'ai le programme d'installation avec .ToString() est une blague. J'ai assez complexe référentiel, avec Entity Framework, pas de génération de code (pur POCO), données personnalisées contexte, l'unité de travail. J'ai fait réécrit toute la plomberie pour EF cartographie. Alors, pensez à ce qui doit être testé. Deuxièmement, ils ne sont pas codées en dur entités - ils sont des "stubs" créé par NBuilder et injectés via DI (en [TestInitialize]), donc avant chaque essai, les données sont les mêmes. Vous êtes libre d'être en désaccord, bien sûr.

OriginalL'auteur RPM1984 | 2010-10-22