programming c++ unit-testing stdout legacy-code

c++ - stdin stdout c programming



Redirige tanto cout como stdout a una cadena en C++ para pruebas unitarias (4)

Estoy trabajando para obtener algún código heredado en pruebas unitarias y, a veces, la única forma de detectar el comportamiento de un programa existente es desde la salida de la consola.

Veo muchos ejemplos en línea de cómo redirigir stdout a otro archivo en C ++, pero ¿hay alguna manera de redirigirlo a una secuencia en memoria para que mis pruebas no dependan del disco?

Me gustaría obtener cualquier cosa que el código heredado envíe a stdout en std :: string para que pueda encontrar fácilmente el resultado.

Editar

El código heredado es tan malo que los usuarios tienen una mezcla de cout << .. y printf . Esto es lo que tengo hasta ahora:

void TestSuite::setUp(void) { oldStdoutBuf = std::cout.rdbuf(); std::cout.rdbuf(consoleOutput.rdbuf()); } void TestSuite::tearDown(void) { std::cout.rdbuf(oldStdoutBuf); }

El problema es que esto no captura la salida usando printf. Me gustaría algo que tenga ambas cosas. ¿Algunas ideas?


Esta puede ser una alternativa:

char bigOutBuf[8192]; char savBuf[8192]; fflush(stdout); setvbuf(stdout,bigOutBuf,IOFBF,8192);//stdout uses your buffer //after each operation strncpy(savBuf,bigOutBuf,8192);//won''t flush until full or fflush called //... //at long last finished setbuf(stdout,NULL);//reset to unnamed buffer

Esto solo intercepta la salida almacenada en el búfer, por lo que sigue yendo a la consola o donde sea.

Espero que esto ayude.


Prueba sprintf, eso es más eficiente.

int i; char str[] = "asdf"; char output[256]; sprintf(output, "asdfasdf %s %d/n", str, i);


Puede usar freopen(..., stdout) y luego volcar el archivo en la memoria o std::string .


std::stringstream puede ser lo que estás buscando.

ACTUALIZAR
Bien, esto es un poco de hack, pero tal vez podrías hacer esto para obtener la salida printf:

char huge_string_buf[MASSIVE_SIZE]; freopen("NUL", "a", stdout); setbuf(stdout, huge_string_buffer);

Tenga en cuenta que debe usar "/ dev / null" para Linux en lugar de "NUL". Eso comenzará a llenar rápidamente a huge_string_buffer. Si desea continuar redirigiendo la salida después de que el búfer está lleno, deberá llamar a fflush (), de lo contrario generará un error. Ver std::setbuf para más información.