2013-07-15 5 views
5

Frage (n)

  • Wie teste ich meine ASP.NET MVC4 Web-Anwendung mit EntityFramework 5?
  • Sollte ich ein spöttisches Framework wie Moq verwenden?

Einführung

Ich habe seit Wochen dieses Thema erforscht. Ich habe viel Material gefunden, aber nichts, was ich die Frage vollständig beantworte. Viele der Informationen sind Jahre alt und möglicherweise nicht anwendbar.Wie schreibe ich Tests für meine Webanwendung?

Meine Situation

ich eine MVC4 Anwendung baue, die einen Umbau einer bestehenden, aber veralteten Anwendung ist. Die Datenbank existiert bereits (und daher der Ansatz der ersten Datenbank), ist groß und komplex. Idealerweise ist das, was ich will, ein falsches Entity-Objekt, das mit meinem Entitäts-Hauptobjekt identisch ist, aber eine andere "Schein" - oder In-Memory-Datenbank verwendet, so dass ich eine Menge gefälschter Daten generieren, die Tests ausführen und ausführen kann Feedback erhalten Zum Beispiel:

FakeEntities _db = new FakeEntities(); 
// test a controller action 

Bisher ...

Von dem, was ich verstehe, so weit soll ich integration testing werden. Nach this post by Ladislav Mrnka Integrationstests bedeutet Aktionen Test Controller und bedeutet weniger Probleme mit LINQ-to-Entities und LINQ-to-Objekte

wenn Sie das Repository verspotten Sie verwenden Linq-To-Objekte und Sie werden eine grüne haben Test, aber wenn Sie die Anwendung mit Linq-To-Einheiten ausgeführt werden Sie eine Ausnahme

bekommen ich weiß, was er meint, und ich zustimmen - ich möchte ich immer mit Linq-To-Entities, um sicherzustellen, bin und eine echte (oder fast reale) Datenbank.

Ich habe viel über die repository pattern gelesen und this blog by linush sieht ziemlich nah an was ich versuchen könnte. Tatsächlich habe ich bereits ein Dummy-Projekt erstellt, in dem ich das Erstellen einer generic repository getestet habe und erfolgreich Entity Framework und einen "Mock" -DbContext verwendet habe, die auf In-Memory-ObjectSets angewiesen waren.

Mein Problem mit diesem Ansatz ist,

  1. Wie oben, bedeutet dies, ich bin mit Linq-To-Objekte anstelle von Linq-To-Entities
  2. Meine Web-App auf die starke Nutzung von Stored verlassen wird
  3. Verfahren

Zusammenfassung, bevor Sie

  • MVC4, EF5 und SQL Server antworten (obwohl ich möchte somewh bleiben bei Datenbank Agnostiker)
  • Fähigkeit Logik zu testen, die
  • Linq-To-Entities
  • Datenbank-First-Ansatz
+4

Nur 50 rep für so viele Fragen !!!!!! Versuchen Sie 0's –

+0

[Compuware AJAX Edition kostenlose Web Performance Analysis und Debugging-Tool] (http://www.compuware.com/en_us/application-performance-management/products/ajax-free-edition/Capabilities.html) –

Antwort

1

Ihre Frage wird sich voller Widersprüche. Zum Beispiel sagen Sie, dass es wichtig ist, gespeicherte Prozeduren zu testen, aber Sie wollen auch datenbankunabhängig sein. Welches ist es?

Wenn Sie wirklich datenbankunabhängig sein möchten, entfernen Sie Ihre gespeicherten Prozeduren und vereinfachen Sie Ihre Testumgebung. Sie können eine vollständig speicherinterne Datenbank (wie Apache Derby) als Teil Ihrer Testumgebung verwenden. Das macht es einfacher, in Jenkins oder was auch immer in Ihrer CI-Umgebung zu schreiben.

Als nächstes müssen Sie entscheiden, was Sie testen möchten. Wenn Sie Komponententests um Ihre Controller wickeln, stellen Sie sicher, dass Sie Ihre Controller als testbar schreiben. Da Sie bei Null beginnen, sollte dies einfach zu tun sein. Verwenden Sie Konzepte wie "Injection", damit Sie Teile Ihrer Funktionalität einfach für Scheinimplementierungen austauschen können. Verwenden Sie ein Mock-Objektrahmenwerk (wie Sie festgestellt haben), um eine Gruppe von Objekten zu erstellen, die Sie an den zu testenden Controller übergeben.

Alles oben genannte ist gut, wenn Sie Ihre Controller selbst testen können. Aber wenn Sie einen hochgradig interdependenten Stack mit gespeicherten Datenbankprozeduren erstellen, die stark mit Controllern und Views interagieren, dann wird dies nicht gut funktionieren. Entwerfen Sie entweder Ihren Ansatz neu, sodass Komponententests möglich sind, oder wechseln Sie zum Funktionstest.

Selenium ist eine der bekanntesten und am häufigsten verwendeten Testumgebungen für Webanwendungen. Sie können das gesamte System von einem Ende zum anderen testen. Noch besser: Sie können mit Selenium-Tests um Ihre vorhandene alte Anwendung herum schreiben und dann sicherstellen, dass die neue Implementierung die gleichen Funktionen während des Neuschreibens reproduziert.