Wenn Sie privat meinen, wie ich es glaube, dann nein - Sie sollten es nicht als Unit testen. Sie sollten nur beobachtbare Verhaltensweisen / Zustände testen. Möglicherweise fehlt der Punkt hinter dem "Rot-Grün-Refaktor" -Zyklus von TDD (und wenn Sie nicht zuerst testen, gilt dasselbe Prinzip). Sobald die Tests geschrieben sind und bestanden wurden, möchten Sie nicht, dass sie sich während des Refactorings ändern. Wenn Sie gezwungen sind, die private Funktionalität einer Unit zu testen, bedeutet dies wahrscheinlich, dass die Unit-Tests in Bezug auf die öffentliche Funktionalität fehlerhaft sind. Wenn es schwierig und komplex ist, Tests für den öffentlichen Code zu schreiben, tut Ihre Klasse möglicherweise zu viel oder Ihr Problem ist nicht klar definiert.
Schlimmer noch, im Laufe der Zeit werden Ihre Komponententests zu einer Kugel und einer Kette, die Sie verlangsamen, ohne irgendeinen Wert hinzuzufügen (eine Änderung der Implementierung, beispielsweise die Optimierung oder das Entfernen von Duplikaten, sollte sich nicht auf die Komponententests auswirken). Interner Code sollte jedoch Unit-getestet werden, da das Verhalten / der Zustand (nur eingeschränkt) beobachtet werden kann.
Als ich zum ersten Mal Unit-Tests durchgeführt habe, habe ich alle möglichen Tricks angewendet, um private Dinge zu testen. Jetzt, da ich ein paar Jahre hinter mir habe, sehe ich das als schlimmer als Zeitverschwendung an.
Hier ist ein dummes Beispiel, natürlich hätten Sie im wirklichen Leben mehr Tests als diese:
Angenommen, Sie haben eine Klasse, die eine sortierte Liste von Zeichenfolgen zurückgibt. Sie sollten überprüfen, ob das Ergebnis sortiert ist und nicht, wie diese Liste tatsächlich sortiert wird. Sie können Ihre Implementierung mit einem einzelnen Algorithmus starten, der nur die Liste sortiert. Sobald dies erledigt ist, muss sich Ihr Test nicht mehr ändern, wenn Sie dann Ihren Sortieralgorithmus ändern. Zu diesem Zeitpunkt haben Sie einen einzelnen Test (vorausgesetzt, die Sortierung ist in Ihre Klasse eingebettet):
- Ist mein Ergebnis sortiert?
Angenommen, Sie möchten zwei Algorithmen (vielleicht ist einer unter bestimmten Umständen effizienter, andere jedoch nicht), dann könnte (und sollte) jeder Algorithmus von einer anderen Klasse bereitgestellt werden und Ihre Klasse wählt sie aus - Sie können überprüfen, ob dies geschieht Ihre gewählten Szenarien verwenden Mocks, aber Ihr ursprünglicher Test ist immer noch gültig und da wir nur beobachtbares Verhalten / Zustand überprüfen, muss er sich nicht ändern. Sie erhalten 3 Tests:
- Ist mein Ergebnis sortiert?
- In einem gegebenen Szenario (sagen wir, die anfängliche Liste ist von Anfang an fast sortiert) wird die Klasse aufgerufen, die Zeichenfolgen mit dem Algorithmus X sortiert.
- In einem gegebenen Szenario (die anfängliche Liste ist in zufälliger Reihenfolge) wird die Klasse aufgerufen, die Zeichenfolgen mit dem Algorithmus Y sortiert.
Die Alternative wäre gewesen, mit dem Testen von privatem Code in Ihrer Klasse zu beginnen - Sie haben nichts davon - die obigen Tests sagen mir alles, was ich zum Testen von Einheiten wissen muss. Wenn Sie private Tests hinzufügen, bauen Sie sich eine Zwangsjacke. Wie viel mehr Arbeit wäre es, wenn Sie nicht nur überprüfen würden, ob das Ergebnis sortiert wurde, sondern auch, wie es sortiert ist?
Tests (dieses Typs) sollten sich nur ändern, wenn sich das Verhalten ändert. Beginnen Sie mit dem Schreiben von Tests für privaten Code und das geht aus dem Fenster.