2009-11-24 10 views
20

Ich habe viel über Test-Driven Development (TDD) gelesen und finde die Prinzipien sehr überzeugend, basierend auf persönlichen Erfahrungen.Testgetriebene Entwicklung mit ASP.NET MVC - wo soll ich anfangen?

Im Moment entwickle ich eine Website für ein Start-up-Projekt, an dem ich beteiligt bin, und ich möchte versuchen, TDD in die Praxis umzusetzen.

So ... Ich erstelle eine leere Lösung in Visual Studio 2010, fügen Sie ein ASP.NET MVC Website-Projekt und ein Testprojekt hinzu.

Ich füge auch eine Klassenbibliothek namens 'Domain', für meine Domain-Objekte, und ein Test-Projekt dafür.

Jetzt frage ich mich, wo ich anfangen soll. Soll ich einen Test schreiben, bevor ich etwas richtig mache? Die Frage ist - sollte ich anfangen, Tests für Domain-Objekte zu schreiben? Wenn ja, worauf genau sollte ich testen, da die Domain-Objekte noch nicht existieren?

Oder sollte ich mit dem Website-Projekt beginnen und Tests dafür schreiben? Wenn ja, wofür sollte ich einen Test schreiben? Die Home-Controller/Index-Aktion?

Antwort

11

Ich beginne normalerweise, indem ich eine Reihe von Geschichten für die Anwendung sammle, die ich entwickeln werde. Daraus generiere ich ein Domänenmodell, normalerweise auf "Papier". Ich organisiere die Geschichten, die ich implementieren werde und beginne mit der Erstellung des Domänenmodells in der DB für die ersten Geschichten.

Sobald ich die anfängliche DB habe, dann verwende ich eine ORM, in meinem Fall LINQ to SQL, um die DB-Tabellen auf eine Reihe von anfänglichen Klassen abzubilden. Normalerweise teste ich den generierten Testcode nicht, so dass mir eine Menge Code als Grundlage für den Anfang zur Verfügung steht. Ich erstelle dann eine Stub-Methode, die eine nicht implementierte Ausnahme auslöst, um ein Feature der ersten Domänenklasse zu implementieren, mit der ich arbeite. Normalerweise beginne ich mit der Validierungslogik. Sobald Sie Ihre Stub-Methode haben, können Sie die VS-Rechtsklick-Menüs verwenden, um einen oder mehrere Komponententests für diese Methode zu erstellen. Dann bist du auf dem Weg.

Sobald ich mit den Domain-Objekten für die erste Geschichte fertig bin, fange ich dann an, mit den MVC-Aspekten zu arbeiten. Zuerst erstelle ich die Ansichtsmodelle für die erste Ansicht. Dies sind normalerweise nur leere Container als dieser Punkt. Dann werde ich die Ansicht erstellen und sie stark in das Ansichtsmodell eingeben. Ich fange an, die Ansicht zu verfeinern und dem Ansichtsmodell Eigenschaften hinzuzufügen, die von der Ansicht benötigt werden. Da das Ansichtsmodell einfach ein Container ist, sind normalerweise keine Unit-Tests damit verbunden. Es wird jedoch in nachfolgenden Controller-Tests verwendet.

Sobald die Ansicht abgeschlossen ist (oder zumindest mein anfängliches Konzept abgeschlossen ist), dann erzeuge ich die Stub-Controller-Aktion oder Aktionen dafür, wiederum die Stub-Methode wirft einfach eine nicht implementierte Ausnahme. Dies ist genug, um es kompilieren zu lassen und ich kann die Tools verwenden, um Komponententests dafür zu erstellen. Ich gehe nach Bedarf vor, um die Methode (n) zu testen und sicherzustellen, dass sie den gegebenen Eingaben angemessen entspricht und ein geeignetes Ansichtsmodell erzeugt. Wenn das Verfahren mehrere Ansichtsmodelle erzeugen kann, d. H. Mehrere Ansichten rendern kann, kann ich über den Prozess des Erzeugens von Ansichtsmodellen/Ansichten/Controller-Code iterieren, bis die Geschichte oder Geschichten vollständig sind.

Wiederholen Sie den Vorgang wie erforderlich, bis Ihre Storys implementiert sind und auf dem Weg refaktorieren.

3

Writing Unit-Tests, bevor auch erklärt, die Klasse, die Sie Prüfung in statischen Sprachen wie C# ein wenig extreme scheint. Also deklarieren Sie zunächst Ihre Domänenklassen, werfen Sie ein paar Schnittstellen, die Operationen definieren, die Sie für diese Domänenobjekte ausführen, und fügen Sie dann eine Klasse hinzu, die eine Schnittstelle implementiert, wobei die Methoden NotImplementedException übergeben werden. In diesem Moment könnten Sie einen Komponententest für diese Klasse schreiben, da alle Typen bekannt sind. Sie führen den Test aus, der fehlschlägt, dann implementieren Sie die Methode und führen den Test erneut aus - es wird bestanden. Dann könnten Sie Ihre Implementierung umgestalten und optimieren, Ihr Komponententest sollte noch bestehen.

Sobald Sie ein schönes Domänenmodell und Datenzugriffsschicht haben, können Sie zu dem Webprojekt, in dem Sie Controller erstellen, mit den zuvor definierten Schnittstellen wechseln (indem Sie einen Konstruktor erstellen, der diese Schnittstelle verwendet). Sie schreiben einen Komponententest für diesen Controller, indem Sie die Schnittstelle durch ein Mock-Objekt ersetzen, sodass Sie die Controller-Aktionen unabhängig von Ihrem Datenzugriffscode testen können.

Und am wichtigsten: Haben Sie keine Angst, Klassen und Schnittstellen hinzuzufügen. Ich habe Leute gesehen, die riesige Methoden schreiben, die mehrere Dinge gleichzeitig ausführen und die schwer zu testen sind. Versuchen Sie, verschiedene Aufgaben in Methoden zu isolieren, für die Sie leicht Spezifikationen schreiben könnten: welche Ausgabe Sie für die verschiedenen möglichen Eingaben erwarten.

2

Für eine lange Antwort sollten Sie kleine Schritte wie folgt machen.

1) -Erste eine versagende Test

[Test] 
    public void AddSameTag() 
    { 
     UserMovie userMovie = new UserMovie(); 

     userMovie.AddTag("action", "dts", "dts"); 
     Assert.AreEqual(2, userMovie.Tags.Count); 
    } 

2) schreiben - einfachste Code Schreiben Sie den Test zu bestehen.

public virtual void AddTag(params string[] tags) 
    { 
     foreach (var text in tags) 
     { 
      Tag tag =new Tag(text.Trim()); 
      if (!movieTags.Contains(tag)) 
       movieTags.Add(tag); 
     } 
    } 

3) - Umgestalten

. Für ASP.NET MVC und TDD Starter können Sie Controller-Test ignorieren und auf Domain von TDD konzentrieren.

Verwandte Themen