Sarebbe perfettamente logico scrivere un test unitario separato per la corrispondenza, perché è abbastanza non banale.
Il codice che hai mostrato match
è un 1-liner piuttosto banale senza casi limite complicati, o è come un esempio semplificato? Comunque, suppongo che sia semplificato ...
Domanda: che senso ha mettere funzioni e costanti nello spazio dei nomi anonimo, se li rende inutilizzabili nei test?
Questa domanda è ciò che voleva farmi saltare qui da quando Deduplicator ha già mostrato un modo perfettamente valido per irrompere e ottenere l'accesso attraverso l' #include
inganno. Ma la formulazione qui fa sembrare che testare ogni singolo dettaglio di implementazione interna di tutto sia una sorta di obiettivo finale universale, quando è lontano da esso.
L'obiettivo del test unitario uniforme non è sempre quello di testare ogni piccola micro-unità interna granulare di funzionalità. La stessa domanda vale per le funzioni di file-scope statici in C. Si possono anche fare la domanda più difficile da risposta chiedendo il motivo per cui gli sviluppatori utilizzano pimpls
in C ++ che richiederebbe sia friendship
e #include
l'inganno a scatola bianca, negoziazione facile verificabilità dei dettagli di implementazione per il miglioramento dei tempi di compilazione, per esempio
Da una sorta di prospettiva pragmatica, potrebbe sembrare disgustoso ma match
potrebbe non essere implementato correttamente con alcuni casi limite che lo fanno inciampare. Tuttavia, se l'unica classe esterna Foo
, a cui ha accesso, match
non è possibile utilizzarla in un modo che incontra quei casi limite, allora è piuttosto irrilevante per la correttezza Foo
che match
ha questi casi limite che non saranno mai incontrati a meno Foo
che non cambino, a quel punto i test Foo
falliranno e lo sapremo immediatamente.
Una mentalità più ossessiva desiderosa di testare ogni singolo dettaglio dell'implementazione interna (forse un software mission-critical, ad esempio) potrebbe voler entrare e far festa, ma molte persone non pensano necessariamente che sia l'idea migliore, in quanto creerebbe il test più fragili che si possano immaginare. YMMV. Ma volevo solo affrontare la formulazione di questa domanda che fa sembrare che questo tipo di testabilità a livello di dettaglio interno super-fine-grained dovrebbe essere un obiettivo finale, quando anche la mentalità più rigorosa di unit test potrebbe rilassare un po 'qui ed evitare di fare radiografie all'interno di ogni classe.
Quindi perché le persone definiscono le funzioni in spazi dei nomi anonimi in C ++ o come funzioni statiche con ambito di file con collegamento interno in C, nascosto al mondo esterno? E questo è principalmente: nasconderli dal mondo esterno. Ciò ha una serie di effetti dalla riduzione dei tempi di compilazione alla riduzione della complessità (ciò a cui non è possibile accedere altrove non può causare problemi altrove) e così via. Probabilmente la testabilità dei dettagli dell'implementazione privata / interna non è la cosa numero uno nella mente delle persone quando lo fanno, diciamo, riducendo i tempi di costruzione e nascondendo la complessità inutile dal mondo esterno.
foo.cpp
, non l'intestazione! OP sembra capire abbastanza bene che non si dovrebbero mettere spazi dei nomi anon in un'intestazione.