2016-04-15 5 views
2

Es gibt eine Frage, die ich kann keine Antwort auf, über TDD mit dem Outside-In-Ansatz finden:Während TDD, wann eine neue mokierte Abhängigkeit zu implementieren?

ich eine neue Einheit (A) umzusetzen, einen Test für sie schreiben und diese Einheit braucht eine Abhängigkeit (B) das gibt es noch nicht. In meinem Test ist es leicht, sich über diese Abhängigkeit lustig zu machen, aber was mache ich in meinem Produktionscode?

Implementiere ich (B) zuerst und lasse meine Tests für (A) in der Zwischenzeit ausfallen, weil ich es nicht weiter implementiert habe, damit die Tests noch bestanden werden?

Oder vervollständige ich zuerst (A) und laß die Tests für (B) scheitern, weil es z. gibt nur "leere" Objekte zurück, anstatt tatsächlich zu tun, was seine Spezifikation ihm sagt?

Oder sollte ich (B) Tests vorübergehend überprüfen lassen, dass es "leere" Objekte zurückgibt, während ich (A) weiterführe - obwohl das eigentlich nicht die (B) Spezifikation ist?

Antwort

3

Die grundlegende Strategie von TDD besteht darin, alle Ihre Tests mit Ausnahme des aktuellen zu bestehen, an dem Sie gerade arbeiten. Mach (A) die Tests bestanden, bevor du dir Sorgen um (B) machst.

Die Reihenfolge, in der Sie Tests und Code für eine Klasse (A) und seine komplizierte Beziehung (B) schreiben würden, ist

  • einen Test für (A) schreiben. [Suite ist rot.]
  • Beginnen Sie, genug von (A) zu implementieren, um den Test, den Sie gerade geschrieben haben, zu bestehen. Entdecke, dass du (B) brauchst. [Suite ist rot.]
  • Mock (B). [Suite ist rot.]
  • Beenden Sie den Test von (A), den Sie gerade geschrieben haben, bestanden. [Suite ist grün. Ahhh!] Refactor.
  • Wenn Sie mit (A) noch nicht an einem guten Haltepunkt sind, gehen Sie zurück an die Spitze und wiederholen Sie den Vorgang, bis Sie mit (A) einen guten Haltepunkt erreicht haben.
  • Schreiben Sie einen Test für (B), der (B) erfordert, einen Teil oder alles zu tun, was der Schein von (B) tut. [Suite ist rot.]
  • Machen Sie den Test, den Sie gerade geschrieben haben, übergeben. [Suite ist grün. Ahhh!] Refactor.
  • Wenn Sie noch nicht alles, was der Mock von (B) in Tests und Code von (B) tut, repliziert haben, gehen Sie zwei Schritte zurück und wiederholen Sie, bis Sie alles reproduziert haben, was der Mock von (B) tut .

An dieser Stelle können Sie wählen, ob Sie etwas mehr an (A) oder (B) arbeiten oder etwas Neues beginnen möchten.

Auch wenn diese Strategie Ihre Tests immer bestehen lässt, stellt sie nicht sicher, dass Ihre Anwendung sofort etwas Nützliches tut. Der Weg, um sicherzustellen, dass Ihre Anwendung schließlich etwas Nützliches tut, geht über TDD hinaus: Beginnen Sie mit dem Schreiben eines Abnahmetests (der gegen die gesamte Anwendung ohne Mocks läuft) und TDD bis zum Abnahmetest und Ihr Gerät testet alle bestanden. (Weitere Informationen finden Sie unter .)

Akzeptanztests (oder andere Integrationstests) stellen außerdem sicher, dass Sie Mocks in Ihren Tests von und für Code für gespottete Klassen korrekt replizieren.

Beachten Sie auch, dass es wichtig ist, Anforderungen zu verfolgen, an die Sie gedacht haben, die aber noch nicht implementiert wurden oder die Sie nur in einem Mock "implementiert" haben und die in Tests und Codes für die gemachte Abhängigkeit implementiert werden müssen . Deshalb sprechen TDD By Example und andere Beispiele dafür, wie TDD gemacht wird, so viel über tatsächliche oder mentale To-Do-Listen.Im Fall einer Klasse (A) mit einer gespotteten Abhängigkeit (B) können Sie nach dem Schreiben des Mocks entweder wieder an (A) arbeiten oder in (B) implementieren, was Sie gerade mit dem Mock getan haben. Wie auch immer, Sie müssen verfolgen, was Sie gewählt haben nicht zu tun, bis Sie bereit sind, zurückzugehen und es zu tun.

0

Ich würde vorschlagen, eine Abhängigkeit von B nur, sobald Sie wirklich B in Ihrem Code benötigen. Wenn nichts in A von B abhängt, warum sollte es in diesem Stadium hinzugefügt werden?

Wenn Ihr Code B wirklich braucht, warum fangen Sie nicht an, die Funktionen von B zu implementieren, die Sie jetzt brauchen?

Natürlich können Sie auch ein Dummy-Objekt in Ihrem Code anstelle von B verwenden, wenn es keine Logik hat. Sonst würde ich mit der Implementierung von B.

beginnen
Verwandte Themen