Reroute stdout to string

时间:2014-04-24 12:45:44

标签: stdout d dmd

好的,所以这就是我要做的事情:

  • 我程序的一部分输出文本到控制台
  • 出于单元测试的目的,我希望能够将该输出变为字符串,以便我可以在assert检查中使用它。

这怎么可能?


注意:

伙计们,如果我误导你,对不起。我正在寻找D的解决方案。

3 个答案:

答案 0 :(得分:2)

这是一种使用管道和线程(与建议的副本不同,不限于预定义的缓冲区大小或存在缓冲区溢出漏洞的风险)的方法:

  1. 使用std.process.pipe
  2. 创建管道
  3. stdout设置为管道的写入端(首先备份)
  4. 生成一个线程,该线程将从管道的读取端读取并将输出附加到字符串,直到管道关闭
  5. 执行手头的任务
  6. 关闭管道的写入端
  7. 恢复stdout
  8. 的旧值
  9. 等待线程完成执行
  10. 使用线程
  11. 创建的缓冲区

    我有一些类似的代码,虽然在另一个方向(异步写作而不是阅读),herehere

答案 1 :(得分:0)

嗯,我只是觉得我自己找到了一种工作方式:

import std.stdio;
import std.conv;
import std.file;

//

string getOutput()
{
     auto initialStdout = stdout;

     // Redirect output to file
     string tmpfile = "tmp/test.out";
     stdout.open(tmpfile, "wt");

     //
     // Do whatever you want to,
     // that generates some output
     //

     stdout = initialStdout; // Restore stdout to what it was

     return to!string(std.file.read(tmpfile)); // Return output
}

答案 2 :(得分:0)

只需使用std.process.executeShell即可。 Phobos文档中的示例足以让您完成所需的操作。