Es wäre absolut logisch, einen separaten Komponententest für das Spiel zu schreiben, da dies nicht trivial ist.
Der Code, für den Sie gezeigt haben, match
ist ein ziemlich trivialer 1-Liner ohne schwierige Randfälle, oder ist das wie ein vereinfachtes Beispiel? Wie auch immer, ich gehe davon aus, dass es vereinfacht ist ...
Frage: Wozu sollten Funktionen und Konstanten in den anonymen Namespace eingefügt werden, wenn sie dadurch in Tests unbrauchbar werden?
Diese Frage wollte mich dazu bringen, hier einzuspringen, da Deduplicator bereits eine sehr gute Möglichkeit zum Einbruch und Durchstieg zeigte #include
Tricks einzudringen . Der Wortlaut hier klingt jedoch so, als würde man jedes einzelne interne Implementierungsdetail von allem testen. Dies ist eine Art universelles Endziel, wenn es weit davon entfernt ist.
Das Ziel selbst von Unit-Tests besteht nicht immer darin, jede kleine granulare interne Mikro-Funktionseinheit zu testen. Dieselbe Frage gilt für statische Dateibereichsfunktionen in C. Sie können die Beantwortung der Frage sogar erschweren, indem Sie fragen, warum Entwickler pimpls
in C ++ verwenden, was beides friendship
und #include
Tricks in der White Box erfordern würde. z.B
Aus einer Art pragmatischer Perspektive mag es grob klingen, aber match
mit einigen Randfällen, die dazu führen, dass es auslöst, möglicherweise nicht richtig implementiert werden. Wenn jedoch die einzige äußere Klasse, Foo
die Zugriff darauf hat, match
es möglicherweise nicht in einer Weise verwenden kann, die auf diese Randfälle stößt Foo
, match
ist dies für die Richtigkeit dieser Randfälle, die niemals angetroffen werden, außer wenn Foo
sich an welchem Punkt etwas ändert, irrelevant Die Tests von Foo
werden fehlschlagen und wir werden es sofort wissen.
Eine obsessivere Denkweise, die jedes einzelne interne Implementierungsdetail testen möchte (möglicherweise eine unternehmenskritische Software, z. B.), möchte vielleicht einbrechen und feiern, aber viele Leute denken nicht unbedingt, dass dies die beste Idee ist, da sie das schaffen würde spröde Tests vorstellbar. YMMV. Aber ich wollte mich nur mit dem Wortlaut dieser Frage befassen, der so klingt, als ob diese Art von überfeinkörniger Testbarkeit auf interner Detailebene ein Endziel sein sollte, wenn sich auch die strengste Einstellung zum Testen von Einheiten hier etwas entspannen könnte und vermeiden Sie es, die Einbauten jeder Klasse zu durchleuchten.
Warum definieren die Benutzer Funktionen in anonymen Namespaces in C ++ oder als statische Funktionen im Dateibereich mit interner Verknüpfung in C, die vor der Außenwelt verborgen sind? Und das war es vor allem: Sie vor der Außenwelt zu verstecken. Dies hat eine Reihe von Effekten, von der Verkürzung der Kompilierungszeiten bis zur Reduzierung der Komplexität (auf was anderswo nicht zugegriffen werden kann, kann an anderer Stelle keine Probleme verursachen) und so weiter. Wahrscheinlich ist die Überprüfbarkeit von privaten / internen Implementierungsdetails nicht das Wichtigste, wenn die Leute dies erledigen, um beispielsweise die Erstellungszeiten zu verkürzen und unnötige Komplexität vor der Außenwelt zu verbergen.
foo.cpp
, nicht der Header! OP scheint recht gut zu verstehen, dass Sie in einem Header keine Namespaces setzen sollten.