如何在ruby中捕获NSLog的输出?

时间:2013-07-08 18:10:48

标签: ruby nslog

我在mac上有一个控制台应用程序,通过NSLog输出错误代码。如何在ruby中运行控制台应用程序时捕获NSLog的结果?

我尝试过像redirecting stderr这样的方法,但这似乎没有办法。

好的,我会将其编辑为清晰明白。

我有一个为MacOS编写的程序,目前通过NSLog报告其输出。出于所有意图和目的,它可以在main.m文件中包含此行:

NSLog(@"Hello world!");

我想捕获那个NSLog的内容。我无法更改程序本身,我只是拥有日志文件。我想在Ruby中进行一些基于rspec的测试。

现在,我无法使用重定向。任何类型的重定向,如:

 @output = `#{theProgramToTest}`
 puts @output

导致无输出。如果我按照我之前链接的问题所描述的那样重定向stderr,我仍然没有结果。那么如何捕获程序的结果呢?我不想将它们重定向到文件。

1 个答案:

答案 0 :(得分:0)

也许这会有所帮助:

require 'stringio'

str_stdout, str_stderr = (1..2).map{ StringIO.new }

puts "redirecting outputs"
old_stdout, old_stderr = $stdout, $stderr
$stdout, $stderr = str_stdout, str_stderr

STDOUT.puts "This is written to the old STDOUT"
STDERR.puts "This is written to the old STDERR"

$stdout.puts "This is written to str_stdout"
$stderr.puts "This is written to str_stderr"

puts 'this is output via "puts"'
`date`
`date >&2` # this is output to stderr

STDOUT.puts "resetting STDOUT and STDERR"

$stdout, $stderr = old_stdout, old_stderr

str_stdout.rewind
str_stderr.rewind

puts str_stdout.read
puts str_stderr.read

哪个输出:

redirecting outputs
This is written to the old STDOUT
This is written to the old STDERR
Mon Jul  8 21:51:19 MST 2013
resetting STDOUT and STDERR
This is written to str_stdout
this is output via "puts"
This is written to str_stderr

使用调试器或PRY查看各种输出何时发生的单步步骤。