我努力让下单元测试一些遗留代码,有时只有这样才能感觉到现有程序的行为是从控制台输出。
我看到很多的例子在线为如何将stdout在C ++另一个文件,但有什么办法,我可以把它重定向到一个内存流,所以我的测试中不必依赖在磁盘上?
我想获得任何遗留代码发送到标准输出到一个std ::字符串,所以我可以很容易地.find的输出。
编辑
遗留代码是如此糟糕,它的用户一个混合cout << ..
和printf
。 这是我到目前为止有:
void TestSuite::setUp(void)
{
oldStdoutBuf = std::cout.rdbuf();
std::cout.rdbuf(consoleOutput.rdbuf());
}
void TestSuite::tearDown(void)
{
std::cout.rdbuf(oldStdoutBuf);
}
问题是,这并不用printf捕捉输出。 我想的东西得到两者。 有任何想法吗?
std::stringstream
可能是你在找什么。
UPDATE
好吧,这是一个有点劈,但也许你可以做到这一点抓住的printf输出:
char huge_string_buf[MASSIVE_SIZE];
freopen("NUL", "a", stdout);
setbuf(stdout, huge_string_buffer);
请注意,您应该使用“的/ dev / null的”为Linux而不是“NUL”。 这将迅速启动填补huge_string_buffer。 如果你希望能够继续重定向输出后的缓冲区满你必须调用fflush(),否则会抛出异常。 见std::setbuf
获取更多信息。
您可以使用freopen(..., stdout)
,然后转储文件到内存或者一个std::string
。
这可以是一种替代方案:
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
这只是拦截缓冲输出,所以还是到控制台或任何地方。
希望这可以帮助。
尝试sprintf的,这是更有效的。
int i;
char str[] = "asdf";
char output[256];
sprintf(output, "asdfasdf %s %d\n", str, i);