Invece di preoccuparsi di come testare la funzione così com'è, mi piacerebbe ridisegnare la funzione di lavorare un po 'più sensibilmente, e testare la versione ri-progettato, invece.
Al momento, la funzione sembra avere tre distinte responsabilità (e solo leggermente correlati): fare una conversione, modificare una stringa fornita esternamente, e scrivere alcuni dati in un flusso. Anche il flusso a cui scrive (std::cout
) è hardcoded: si tratta di un problema in attesa (ad esempio, la conversione in un ambiente GUI è probabilmente non banale).
Vorrei iniziare con 1) dividerlo in funzioni logiche e 2) fornire il flusso come parametro.
std::string convert_int(int val) {
switch (val) {
case 1: return "1";
case 2: return "2";
default: return "Nix";
}
}
std::ostream &write_string(std::ostream &os, std::string const &s) {
return os << s;
}
non ho incluso nulla a che (in particolare) modificare una stringa di alimentazione esterna - ovviamente è possibile assegnare il valore restituito da convert_int
come meglio credi, e il valore della stringa che è stato passato in wasn' Comunque sia usato.
Sinceramente, write_string
è un buon candidato da eliminare completamente, ma dal momento che hai avuto quel tipo di capacità di base, lo terremo per il momento. Il test di questi è relativamente semplice: per convert_int
, esaminiamo la stringa che restituisce e confrontiamo con ciò che ci aspettiamo. Per write_string
, possiamo passare un stringstream
anziché un normale ostream
- quindi possiamo usare .str()
per ottenere quel risultato come stringa e (di nuovo) confrontare a quello che ci aspettiamo.
fonte
2010-05-06 16:44:20
Assicurati solo che l'effetto desiderato si sia verificato dopo la chiamata? – jball
Suppongo che "effetto collaterale" in questo esempio si riferisca all'output di std :: cout. –
Devo chiedere, però, perché non si restituisce semplicemente una stringa anziché passare un riferimento? Stai sostituendo completamente quello che hai inserito, in modo da non trarre vantaggio dalle prestazioni evitando la copia (dal momento che non lo eviti), e se hai restituito la stringa, potresti beneficiare di RVO (ottimizzazione del valore di ritorno) . –