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é matchest 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 #includeruse. 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 pimplsen C ++ qui nécessiteraient les deux friendship et la #includeruse à 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 matchpeut 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 à, matchne peut pas l'utiliser d'une manière qui rencontre ces cas marginaux, alors c'est peu pertinent pour l'exactitude de Foocela matcha ces cas limites qui ne seront jamais rencontrés à moins de Foochangements, à 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.