Ich bereite gerade die Grundlagen für eine ASP.Net MVC-Anwendung vor und überlege, welche Art von Komponententests ich schreiben sollte. Ich habe an mehreren Stellen gesehen, dass die Leute im Wesentlichen sagten: "Machen Sie sich nicht die Mühe, Ihre Ansichten zu testen, es gibt keine Logik und es ist trivial und wird durch einen Integrationstest abgedeckt."
Ich verstehe nicht, wie dies zur anerkannten Weisheit geworden ist. Integrationstests dienen einem ganz anderen Zweck als Unit-Tests. Wenn ich etwas kaputt mache, möchte ich nicht eine halbe Stunde später wissen, wann meine Integrationstests kaputt gehen, ich möchte es sofort wissen.
Beispielszenario: Nehmen wir an, wir haben es mit einer Standard-CRUD-App mit einer Kundenentität zu tun. Der Kunde hat einen Namen und eine Adresse. Bei jeder Teststufe möchte ich sicherstellen, dass die Kundenabruflogik sowohl den Namen als auch die Adresse ordnungsgemäß abruft.
Um das Repository auf Unit-Tests zu testen, schreibe ich einen Integrationstest, um die Datenbank zu erreichen. Um die Geschäftsregeln auf Unit-Tests zu testen, verspotte ich das Repository, füttere die Geschäftsregeln mit den entsprechenden Daten und stelle sicher, dass meine erwarteten Ergebnisse zurückgegeben werden.
Was ich tun möchte: Um die Benutzeroberfläche einem Komponententest zu unterziehen, verspotte ich die Geschäftsregeln, richte meine erwartete Kundeninstanz ein, rendere die Ansicht und stelle sicher, dass die Ansicht die entsprechenden Werte für die von mir angegebene Instanz enthält.
Was ich nicht machen kann: Um das Repository zu testen, schreibe ich einen Integrationstest, richte ein entsprechendes Login ein, erstelle die erforderlichen Daten in der Datenbank, öffne einen Browser, navigiere zum Kunden und vergewissere mich, dass die resultierende Seite das entsprechende enthält Werte für die angegebene Instanz.
Mir ist klar, dass es Überschneidungen zwischen den beiden oben diskutierten Szenarien gibt, aber der Hauptunterschied ist die Zeit und der Aufwand, die erforderlich sind, um die Tests einzurichten und auszuführen.
Wenn ich (oder ein anderer Entwickler) das Adressfeld aus der Ansicht entferne, möchte ich nicht warten, bis der Integrationstest dies feststellt. Ich möchte in einem Unit-Test entdeckt und markiert werden, der mehrmals täglich durchgeführt wird.
Ich habe das Gefühl, dass ich ein Schlüsselkonzept einfach nicht verstehe. Kann jemand erklären, warum es eine schlechte Sache ist, ein sofortiges Test-Feedback zur Gültigkeit einer MVC-Ansicht zu erhalten? (oder wenn nicht schlecht, dann nicht der erwartete Weg, um besagtes Feedback zu bekommen)
"To unit-test the repository, I write an integration test"
Warte was? Dies ist kein Komponententest des Repository. Sie automatisieren den Test dafür, aber der getestete Code enthält weiterhin die DAL und die Datenbank. Um das Repository einem Komponententest zu unterziehen, isolieren Sie es wie für Ihre Geschäftsregeln.