Il serait parfaitement logique d'écrire un test unitaire séparé pour la correspondance, car il n'est pas banal.
Le code que vous avez montré match
est un 1-liner assez trivial sans cas de bord délicat, ou est-ce comme un exemple simplifié? Quoi qu'il en soit, je suppose que c'est simplifié ...
Question: quel est l'intérêt de mettre des fonctions et des constantes dans l'espace de noms anonyme, si cela les rend inutilisables dans les tests?
Cette question est ce qui voulait me faire sauter ici, car Deduplicator a déjà montré un excellent moyen de pénétrer et d'accéder à la #include
ruse. Mais le libellé ici donne l'impression que tester chaque détail d'implémentation interne de tout est une sorte d'objectif final universel, quand il est loin de là.
L'objectif d'un test unitaire uniforme n'est pas toujours de tester chaque petite micro-unité interne granulaire de fonctionnalité. La même question s'applique aux fonctions statiques de portée de fichier en C. Vous pouvez même rendre la question plus difficile à répondre en demandant pourquoi les développeurs utilisent pimpls
en C ++ qui nécessiteraient les deux friendship
et la #include
ruse à la boîte blanche, échangeant une testabilité facile des détails d'implémentation pour des temps de compilation améliorés, par exemple
Dans une sorte de perspective pragmatique, cela peut sembler grossier mais match
peut ne pas être correctement mis en œuvre avec certains cas de bord qui le font se déclencher. Cependant, si la seule classe externe Foo
, qui a accès à, match
ne peut pas l'utiliser d'une manière qui rencontre ces cas marginaux, alors c'est peu pertinent pour l'exactitude de Foo
cela match
a ces cas limites qui ne seront jamais rencontrés à moins de Foo
changements, à quel point les tests Foo
échoueront et nous le saurons immédiatement.
Un état d'esprit plus obsessionnel désireux de tester chaque détail d'implémentation interne (peut-être un logiciel essentiel à la mission, par exemple) pourrait vouloir s'introduire et faire la fête, mais beaucoup de gens ne pensent pas nécessairement que c'est la meilleure idée, car cela créerait le tests les plus fragiles imaginables. YMMV. Mais je voulais juste aborder le libellé de cette question qui donne l'impression que ce genre de testabilité au niveau de détail interne ultra fin devrait être un objectif final, alors que même l'état d'esprit des tests unitaires les plus rigoureux pourrait se détendre un peu ici et éviter de radiographier les internes de chaque classe.
Alors pourquoi les gens définissent-ils des fonctions dans des espaces de noms anonymes en C ++ ou en tant que fonctions statiques de portée de fichier avec une liaison interne en C, cachées du monde extérieur? Et c'est surtout ça: les cacher du monde extérieur. Cela a un certain nombre d'effets, de la réduction des temps de compilation à la réduction de la complexité (ce qui n'est pas accessible ailleurs ne peut pas causer de problèmes ailleurs) et ainsi de suite. La testabilité des détails d'implémentation privés / internes n'est probablement pas la chose la plus importante dans l'esprit des gens lorsqu'ils le font, par exemple, en réduisant les temps de construction et en cachant la complexité inutile du monde extérieur.
foo.cpp
, pas l'en-tête! OP semble comprendre très bien que vous ne devriez pas mettre des espaces de noms dans un en-tête.