Mam funkcję odczytywania danych wprowadzanych przez użytkownika ze std :: cin i chcę napisać unittest, który wstawia niektóre ciągi znaków do std :: cin, tak, że później wyodrębnianie ze std :: cin będzie przeczytaj ten ciąg, zamiast wstrzymywać go przed wprowadzeniem z klawiatury.Wstrzykiwanie łańcucha znaków do 'cin'
Najlepiej byłoby zmienić sygnaturę funkcji, aby móc przekazać niestandardowy kod istream jako parametry, ale nie mogę tego zrobić, ponieważ mam stały interfejs, którego nie mogę zmienić.
cin.putback() to prawie co chciałem, jednak wstawia tylko jedną postać na raz, i wstawia je w odwrotnej kolejności (ale czytałem gdzieś, że przywracanie char, który nie był pierwotnie może być niebezpiecznie, chociaż strona nie wyjaśnia dlaczego). Próbowałem kilka metod, aby wstrzyknąć ciąg do wewnętrznego bufora cin.rdbuf() cin, ale żaden też by nie zadziałał. Zastanawiałem się też nad użyciem zewnętrznego skryptu testowego lub tworzenia podprocesu, ale chciałbym najpierw rozważyć test w czystym C++.
Czy jest więc jakaś metoda umieszczania napisów w cin? A może znasz lepszy sposób na wstrzyknięcie mojego "fałszywego wejścia klawiatury"?
+1. lub 'stringbuf sb (" testdata "); streambuf * backup = cin.rdbuf (&sb); 'To jest zgodne i rozsądnie przenośne, ale nie jest to dobra praktyka O tak, i być może będzie musiał zrobić' cin.clear() ', aby uniknąć warunku EOF po wyczerpaniu się danych wejściowych : vP. – Potatoswatter
+1 dokładnie to, o co prosiłem (wciąż jednak zastanawiam się, czy robienie czegoś takiego jest dobrym pomysłem, nawet dla kodu testowego WhiteBoxa). –