Ho una funzione che legge l'input dell'utente da std :: cin, e voglio scrivere un unittest che inserisce alcune stringhe in std :: cin, così che l'estrazione successiva da std :: cin sarà leggi quella stringa invece di mettere in pausa per l'input da tastiera.Injecting string to 'cin'
Idealmente, cambierei la firma della funzione in modo da poter passare un istream personalizzato come parametri, ma non posso farlo qui poiché ho un'interfaccia fissa che non posso cambiare.
cin.putback() è quasi quello che volevo, tuttavia è inserendo un solo carattere alla volta, e li sta inserendo in ordine inverso (ma ho letto da qualche parte che rimettere char che non era originariamente ci può essere pericoloso, anche se il sito Web non elabora perché). Ho provato diversi metodi per iniettare la stringa sul cin.rdbuf() del buffer interno di cin, ma nessuno funzionerebbe neanche. Ho anche preso in considerazione l'utilizzo di uno script di test esterno o la creazione di sottoprocessi, tuttavia mi piacerebbe prima considerare un test in puro C++.
Quindi, esiste un metodo per inserire le stringhe in cin? O conosci un modo migliore per iniettare il mio "falso input da tastiera"?
+1. o 'stringbuf sb (" testdata "); streambuf * backup = cin.rdbuf (&sb); '. È conforme e ragionevolmente portatile, ma non una buona pratica. Oh sì, e potrebbe dover fare' cin.clear() 'per uscire dalla condizione EOF una volta che l'input è scaduto : vP. – Potatoswatter
+1 esattamente quello che ho chiesto (mi sto ancora chiedendo personalmente se fare qualcosa del genere sia una buona idea, anche per un codice di prova whitebox). –