Wie testen Sie CRUD-Vorgänge in einem Repository ordnungsgemäß?

8

Versteht, dass das eine breite Frage ist - lasst mich das klarstellen. Ich habe ein Repository über eine Schnittstelle mit zwei konkreten Implementierungen offengelegt - einem MockRepository und einem EntityFrameworkRepository .

Jetzt habe ich ein Unit-Test-Projekt, für das alle Tests gegen das Repository entweder ausgeführt werden können, indem Sie über eine Zeile in [TestInitialize] blättern.

Meine Frage ist im Grunde "Wie soll ich die Tests schreiben".

Folgendes habe ich:

C reate

%Vor%

R etrieve

%Vor%

U pdate

%Vor%

D elete

%Vor%

Es funktioniert ok , sowohl für das Mock- als auch für das EF-Repository, aber mein Hauptproblem ist C (Create). Ich bin mir nicht sicher, wie ich eine Add-Operation für mein Repository testen kann. Es fühlt sich nicht richtig an was es macht.

Er wird für das EF-Repository übergeben, aber um es in meinem Mock-Repository passieren zu lassen, musste ich Reflection verwenden, um die ID in der speicherinternen Sammlung zu aktualisieren (böse).

Also - können Sie bitte einen Ratschlag geben, wie CRUD-Operationen auf dem Repository-Muster richtig getestet werden können?

Dies ist eine ASP.NET MVC-Anwendung, .NET 4, C #, Entity Framework 4 und Unit of Work / Repository Patterns.

Danke.

BEARBEITEN

Nur um Leute zu klären, das sind nicht all die Unit-Tests, die ich habe. Ich habe Unit-Tests für meine Service-Ebene sowie Business-Rule-Tests.

Letzteres wird (und sollte) fehlschlagen, wenn meine obigen Repository-Tests fehlschlagen. Das ist der Punkt hier, um die sehr grundlegenden Operationen meiner Repositories zu testen. Bin ich falsch?

    
RPM1984 22.10.2010, 03:46
quelle

2 Antworten

3

Eine Option ist die Verwendung einer speicherinternen DB wie SqlLite, um das Verhalten Ihrer Mappings, Abfragen und Repositories zu testen. Dies wird von Ayende hier diskutiert, obwohl sein Beispiel NHibernate verwendet.

Eine weitere Option, die Ihr augenblickliches Anliegen, die IDs der Domänenobjekte festzulegen, zu lösen scheint, besteht in der Verwendung von Test-Fälschungen. Dies wird von RhysC hier diskutiert.

    
martinl 22.10.2010, 04:14
quelle
1

IMO, sollte dein Test erstellen:

  • fügt dem Repository eine Entität hinzu
  • bestätigen, dass ihm eine ID zugewiesen wurde
  • ruft die eingefügte Entität mit der ID
  • ab
  • Vergleiche die anfängliche Entität mit der gelesenen Entität und vergewissere dich, dass ihre Eigenschaften identisch sind

Ich habe viele Komponententests wie deins, der Hauptunterschied ist, dass ich eine tiefe Vergleichsmethode verwende, um Objektinstanzen zu vergleichen. Zum Beispiel sehen meine U-Tests so aus:

  • fügt dem Repository eine Entität hinzu
  • ruft die eingefügte Entität mit der ID
  • ab
  • Ändern Sie einige der Entitätseigenschaften
  • Aktualisieren Sie die Entität im Repository
  • ruft die aktualisierte Entität mit der ID
  • ab
  • Vergleichen Sie die aktualisierte Entität mit der gelesenen Entität und stellen Sie sicher, dass ihre Eigenschaften identisch sind (Sie können eine spezifische Logik für Eigenschaften definieren, die nicht aktualisierbar sind)
vc 74 22.10.2010 07:25
quelle