Wie man Richtig Einheit-Test der CRUD-Operationen auf ein Repository?

Erkennen, dies kann klingen wie eine umfassende Frage -, so lassen Sie mich klarstellen. Ich habe ein Repository ausgesetzt über eine Schnittstelle, mit zwei konkreten Implementierungen - eine MockRepository und ein EntityFrameworkRepository.

Nun, ich habe ein Unit-Test-Projekt, bei dem alle tests ausgeführt werden können, gegen entweder repository per Finger über eine Zeile in [TestInitialize].

Meine Frage ist im Grunde "Wie soll ich das schreiben der tests".

Hier ist, was ich habe:

C reate

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

Es funktioniert ok, sowohl die Mock-und EF-repository, aber mein Hauptproblem ist C (Create). Ich bin mir nicht sicher, wie Sie Sie zu testen, ein Add-operation auf mein Repository. Es spielt keine fühlen was im das tun.

Geht es für die EF-Repository, aber es passieren in meinem Mock-Repository hatte ich zu reflektion verwenden, um aktualisieren Sie die ID in der in-memory-Sammlung (böse).

So können Sie bitte geben Sie einige Ratschläge auf was sind die richtigen Wege, um zu testen, CRUD Operationen auf dem Repository-Pattern?

Dies ist ein ASP.NET MVC-Anwendung .NET 4, C#, Entity Framework 4 und die Einheit der Arbeit/Repository-Muster.

Dank.

BEARBEITEN

Genau zu klären, Jungs, diese sind nicht alle die unit-tests, die ich habe. Ich habe unit tests für meine service-Schicht, sowie business-Regel-tests.

Beide letztere wird (und sollte) fehl, wenn meine oben genannten Repository-tests fehlschlagen. Das ist der Punkt hier, um unit-test der sehr grundlegende Operationen meiner Repositories. Bin ich falsch?

  • Was du testen hier? Riecht wie du bist-Tests für das schreiben von tests.
  • eigentlich schrieb ich die tests, bevor ich implementiert die repositories (TDD). Sagen Sie, dass Sie nicht die Mühe der Prüfung Ihres repositories? Überlegen Sie, wie viele 'sinnlose' bugs gefunden werden könnten, die in der business/system-Tests. Man kann (und sollte) hervorgehoben werden, während ein Test mit einem CI build. Don ' T Sie denken?
  • Und denken Sie daran, ich Teste über interfaces. Repository ist der Typ IRepository<Foo>. Also alles, was ich bin versucht zu tun ist, sicherzustellen, dass meine Repositories sind in der Lage, grundlegende Operationen auf einem persistenten Speicher (egal ob store ein in-memory-mock-repo, oder ein EF-repository).
  • In meiner Erfahrung, die ich verbringen mehr Zeit mit dem schreiben in-memory-Implementierungen und den Umgang mit Replikation der Effekte von Ausdauer ( besonders in Bezug auf Ids ) als jede Zeit, die ich sparen würde, indem Sie sicherstellen, dass GetById() gibt ein einzelnes Objekt. Plus, weil es aussieht bist du eigentlich hardcoding-Entitäten in Ihre Speicher-Repositorys führen Sie in eine "who watches the watcher" - Szenario, in dem Ihr nur die Prüfung selbst. Testen ein ORM erfolgreich zurückgegeben wird ein Objekt von Id ist auch ein Witz. Mir gefällt die Prüfung ToString().
  • ich bin nicht einverstanden. Erstens, Vergleich der Repository habe ich das setup mit .ToString() ist ein Witz. Ich habe eine Recht komplexe repository, mit Entity Framework, keine code-Generierung (Reine POCO-s), benutzerdefinierte Daten, Zusammenhang, Einheit der Arbeit. Ich habe im Grunde neu geschrieben, alle Sanitär-für EF-mapping. So denke, das muss getestet werden. Zweitens, Sie sind nicht hardcoded Entitäten - Sie sind 'stubs' erstellt von NBuilder und injiziert über DI (in [TestInitialize]), daher vor jedem test ausgeführt, die Daten sind die gleichen. Sie sind frei zu widersprechen, natürlich.
  • und ein letzter Punkt, weil wir umgesetzt haben unser Repository, interfaces, können wir die Umstellung auf NHibernate jedes mal, wenn wir mögen. Wenn wir nicht diese tests, wie können wir sicherstellen, dass die Implementierung erfolgreich arbeitet? Diese tests sollten pass gegen eine Umsetzung des IRepository.

InformationsquelleAutor RPM1984 | 2010-10-22
Schreibe einen Kommentar