2009-07-10 8 views
0

Erste Schritte mit TDD und ich möchte ein Repository-driven Modell aufstellen. Aber wie kann ich NUnit effektiv sagen:TDD - Test-Existenz der Schnittstelle

SomeInterfaceExists() 

Ich will Tests für jedes Domänenmodell erstellen (z ICarRepository, IDriverRepository), etc.)

Ist dies tatsächlich Sinn?

Grüße

Antwort

4

TDD bedeutet, dass Sie Ihre Entwicklung (Design) fahren durch in einem Test-First Weise vorgegangen, Sie

  1. Schreiben Sie den Umriss (Methoden) der Klasse Sie
  2. Bedeutung
  3. Sie erstellen eine Einheit testen möchten Test für die Skizze Ihrer Klasse
  4. Sie Ihre Unit-Test laufen -> es
  5. Sie hacken Ihre Klasse, gerade genug, um den Test zu bestehen
  6. Sie Refactoring Klasse scheitern

Dies wird für jeden Artikel wiederholt.

void AssertSomeInterfaceExists(object domainObject) 
{ 
    Assert.IsTrue(domainObject is ICarRepository); 
} 

Sie können diesen Test schreiben und es wird danach fehlschlagen, wenn jemand nicht mehr Ihre Domain-Objekt ändert sich auf ICarRepository implementieren:

4

Das ist nichts, was Sie mit TDD testen. Der Test ist kann ich eine der Methoden dieser Schnittstelle auf dieser Klasse aufrufen, und gibt es das Richtige zurück.

+0

Jedes Mal wenn ich TDD gesehen habe, machen sie das Huhn und Ei-Szenario. Z.B. Sie erstellen einen Test, der besagt, ob diese Methode existiert ... zuerst rot, dann implementieren sie sie ... bringen sie das erwartete Ergebnis zum Scheitern ... dann wird es grün. Wenn ich mein Repository testen möchte, sollte ich damit beginnen, zu testen, ob das Interface existiert? –

+0

Einen Link anzeigen. Ich denke, das ist lächerlich. –

+1

Genauer gesagt, im "reinen" TDD entscheiden Sie nicht im Voraus, dass Sie eine Schnittstelle erstellen werden. Sie beginnen mit dem Schreiben eines fehlgeschlagenen Tests. Wenn Sie einen Datenzugriff durchführen müssen, um den Test zu bestehen, und wenn Sie entschieden haben, dass Sie dieses Muster verwenden werden, erstellen Sie die Schnittstelle - mit der einen Methode, die Sie benötigen. Erstellen Sie dann die Klasse, die die eine Methode implementiert, die Sie benötigen. Dann sehen Sie sich den Test an, refactor, refactor, repeat. –

0

Was passiert, wenn Ihr Domänenobjekt keinen Datenzugriffscode erfordert? Ein Beispiel - ein Einkaufswagen?

2

Man könnte so etwas wie die folgenden schreiben. Ihre anderen Komponententests, die von Ihrem Domänenobjekt abhängen, das diese Schnittstelle implementiert, werden jedoch nicht mehr kompiliert, was diesen Test etwas überflüssig machen würde.

0

Sie könnten Reflexion verwenden, um die Existenz einer Schnittstelle zu erahnen, aber das scheint die Idee von TDD auszudehnen.

Denken Sie daran, dass es bei TDD darum geht, sicherzustellen, dass die Funktionalität im Laufe der Zeit erhalten bleibt, und nicht über die Geltendmachung eines bestimmten Entwurfsmusters. Wie Juri darauf hinweist, ist der Test nicht die absolute erste Sache, die Sie bauen.

3

Ich würde sagen, dass der Compiler "testet" (und ich weiß, das ist eine strittige Aussage) die Schnittstellen Existenz, wenn es versucht, eine Klasse zu kompilieren, die es implementiert. Ich würde erwarten, explizit die Existenz der Schnittstellen in einem Test zu testen, da es nichts beweist. Sie testen nicht, dass eine Klasse definiert wurde, Sie testen die Methoden für eine Klasse.

1

Sie müssen nicht testen, ob Ihre Schnittstelle existiert oder nicht. Sie testen dort nichts.

2

Die Existenz von Schnittstellen ist Implizität getestet jedes Mal, wenn Sie die Schnittstelle in einem Test verwenden.Zum Beispiel vor der Schnittstelle oder jede Implementierungen vorhanden, könnte man einen Test schreiben, der sagt, teil:

ICar car = new Convertible(); 

Das die Existenz der IKAR-Schnittstelle stellt - Ihr Test wird nicht kompiliert, bis es erstellt wird - und das Convertible implementiert ICar. Jede Methode auf Auto, die Sie aufrufen, wird mehr von der Schnittstelle ausarbeiten.