Comment tester correctement les opérations CRUD sur un référentiel?

c# crud entity-framework repository unit-testing

Question

Réalisez que cela peut sembler une question générale - alors laissez-moi préciser. J'ai un référentiel exposé via une interface, avec deux implémentations concrètes: un MockRepository et un EntityFrameworkRepository .

Maintenant, j'ai un projet de tests unitaires pour lequel tous les tests peuvent être exécutés sur l' un des référentiels, en survolant une ligne dans [TestInitialize] .

Ma question est essentiellement "Comment devrais-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);

EXTRACTION

// 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);

Cela fonctionne bien , à la fois pour le référentiel Mock et EF, mais mon problème principal est C (Create). Je ne sais pas comment tester une opération d'ajout sur mon référentiel. Je ne sens pas ce que je fais.

Il passe pour le référentiel EF, mais pour le faire passer dans mon référentiel simulé, je devais utiliser la réflexion pour mettre à jour l'ID de la collection en mémoire (méchant).

Alors, pouvez-vous partager quelques conseils sur les méthodes correctes pour tester les opérations CRUD sur le modèle de référentiel?

Il s’agit d’une application ASP.NET MVC, de .NET 4, de C #, d’Entity Framework 4 et de modèles d’unité de travail / de référentiel.

Merci.

MODIFIER

Juste pour clarifier les gars, ce ne sont pas tous les tests unitaires que j'ai. J'ai des tests unitaires pour ma couche de services, ainsi que des tests de règles métier.

Ce dernier échouera (et devrait échouer) si les tests de référentiel ci-dessus échouent. C’est le point ici, de tester un peu les opérations de base de mes dépôts. Ai-je tort?

Réponse acceptée

Une option consiste à utiliser une base de données en mémoire telle que SqlLite pour tester le comportement de vos mappages, requêtes et référentiels. Ayende en parle ici , bien que son exemple utilise NHibernate.

Une autre option qui semble répondre à votre préoccupation immédiate de définir les identifiants des objets de domaine consiste à utiliser des faux tests. Ceci est discuté par RhysC ici .


Réponse populaire

OMI, votre test de création devrait:

  • ajouter une entité au référentiel
  • affirmer qu'il a reçu un identifiant
  • récupérer l'entité insérée à l'aide de l'ID
  • comparer l'entité initiale avec l'entité de lecture et s'assurer que leurs propriétés sont identiques

J'ai de nombreux tests unitaires comme le vôtre. La principale différence est que j'utilise une méthode de comparaison approfondie pour comparer les instances d'objet. Par exemple, mes tests U ressemblent à ceci:

  • ajouter une entité au référentiel
  • récupérer l'entité insérée à l'aide de l'ID
  • changer certaines des propriétés de l'entité
  • mettre à jour l'entité dans le référentiel
  • récupérer l'entité mise à jour à l'aide de l'ID
  • comparer l'entité mise à jour avec l'entité de lecture et s'assurer que leurs propriétés sont identiques (vous pouvez définir une logique spécifique pour les propriétés non modifiables)


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow