Soweit ich das verstehe, scheinen sich die meisten Leute einig zu sein, dass private Methoden nicht direkt getestet werden sollten, sondern mit welchen öffentlichen Methoden auch immer. Ich kann ihren Punkt sehen, aber ich habe einige Probleme damit, wenn ich versuche, den "Drei Gesetzen von TDD" zu folgen und den "Rot-Grün-Refaktor" -Zyklus zu verwenden. Ich denke, das lässt sich am besten anhand eines Beispiels erklären:
Im Moment benötige ich ein Programm, das eine Datei (mit durch Tabulatoren getrennten Daten) lesen und alle Spalten herausfiltern kann, die nicht numerische Daten enthalten. Vermutlich gibt es bereits einige einfache Tools, um dies zu tun, aber ich habe mich dazu entschlossen, es von Grund auf neu zu implementieren, hauptsächlich, weil ich dachte, dass es ein schönes und sauberes Projekt für mich sein könnte, etwas Übung mit TDD zu bekommen.
Also setze ich zuerst den roten Hut auf, das heißt, ich brauche einen Test, der fehlschlägt. Ich dachte, ich brauche eine Methode, die alle nicht numerischen Felder in einer Zeile findet. Also schreibe ich einen einfachen Test, der natürlich nicht sofort kompiliert werden kann, also beginne ich, die Funktion selbst zu schreiben, und nach ein paar Zyklen hin und her (rot / grün) habe ich eine funktionierende Funktion und einen vollständigen Test.
Als nächstes fahre ich mit der Funktion "gatherNonNumericColumns" fort, die die Datei zeilenweise liest und in jeder Zeile meine Funktion "findNonNumericFields" aufruft, um alle Spalten zu sammeln, die schließlich entfernt werden müssen. Ein paar Rot-Grün-Zyklen, und ich habe wieder eine funktionierende Funktion und einen vollständigen Test.
Jetzt denke ich, ich sollte umgestalten. Da meine Methode "findNonNumericFields" nur deswegen entworfen wurde, weil ich dachte, sie würde für die Implementierung von "gatherNonNumericColumns" benötigt, erscheint es mir sinnvoll, "findNonNumericFields" privat werden zu lassen. Dies würde jedoch meine ersten Tests unterbrechen, da sie keinen Zugriff mehr auf die von ihnen getestete Methode hätten.
Also habe ich eine private Methode und eine Reihe von Tests, die es testen. Da so viele Leute raten, dass private Methoden nicht getestet werden sollten, habe ich das Gefühl, dass ich mich hier in eine Ecke gestrichen habe. Aber wo genau bin ich gescheitert?
Ich könnte auf einer höheren Ebene anfangen und einen Test schreiben, der testet, welche Methode irgendwann zu meiner öffentlichen Methode wird (findAndFilterOutAllNonNumericalColumns), der sich jedoch etwas gegen den ganzen Punkt von TDD anfühlt (zumindest laut Uncle Bob). : Dass Sie ständig zwischen dem Schreiben von Tests und Produktionscode wechseln sollten und dass alle Ihre Tests zu jedem Zeitpunkt in der letzten Minute oder so funktionierten. Denn wenn ich mit dem Schreiben eines Tests für eine öffentliche Methode beginne, wird es einige Minuten (oder Stunden oder sogar Tage in sehr komplexen Fällen) dauern, bis ich alle Details in den privaten Methoden zum Funktionieren gebracht habe, damit der Test die Öffentlichkeit testet Methode besteht.
Also, was ist zu tun? Ist TDD (mit dem schnellen Rot-Grün-Refaktor-Zyklus) einfach nicht mit privaten Methoden kompatibel? Oder liegt ein Fehler in meinem Design vor?
private
ob es Sinn macht, es zu tun.