我正在编写单元测试,因此无法更改我正在测试的文件中的代码。我正在测试的代码在cout中有消息,我试图重定向到文件中以检查以确保程序正在输出正确的消息。有没有人有办法在另一个不会导致滞后的程序中重定向stdout?我试过freopen(),这导致我的程序因某种原因挂起。
答案 0 :(得分:2)
您可以创建一个filebuf
,然后用它替换cout
的streambuf:
{
std::filebuf f;
f.open("output.txt", std::ios::out);
std::streambuf* o = std::cout.rdbuf(&f);
std::cout << "hello" << std::endl; // endl will flush the stream
std::cout.rdbuf(o);
}
你需要再次恢复cout
的原始streambuf(或将其设置为空指针),否则当全局流被刷新和销毁时它可能会崩溃,因为filebuf
已经有了超出了范围。
答案 1 :(得分:1)
您可以使用'open()'和'dup2()'。您可以使用下面提供的帮助程序。如何使用它们的一个例子:
void
code_to_test ()
{
std::cout << "Here we go" << std::endl;
std::cerr << "Danger danger" << std::endl;
}
run_test(code_to_test);
run_test
帮助程序调用重定向,并运行测试代码。
template <typename TEST> void
run_test (TEST t, bool append = false) {
flush_output();
Redirect o(1, "/tmp/test_stdout", append);
Redirect e(2, "/tmp/test_stderr", append);
t();
flush_output();
}
flush_output
帮助程序刷新流。
void flush_output () {
fflush(stdout);
fflush(stderr);
std::cout.flush();
std::cerr.flush();
}
Redirect
类影响构造函数中的重定向。它将原始描述符恢复到析构函数中。
class Redirect
{
int m_what;
int m_old_what;
public:
Redirect (int what, std::string where, bool append = false)
: m_what(what), m_old_what(dup(what)) {
int flags = O_CREAT|O_WRONLY;
if (append) flags |= O_APPEND;
int f = open(where.c_str(), flags, 0660);
dup2(f, m_what);
close(f);
}
~Redirect () {
dup2(m_old_what, m_what);
close(m_old_what);
}
};