使用ruby将输出抑制到控制台

den*_*chr 18 ruby console suppress-warnings

我正在编写一些单元测试,如下所示:

def executing_a_signal
  a_method(a_signal.new, a_model, a_helper);
  assert_equal(new_state, a_model.state)
end
Run Code Online (Sandbox Code Playgroud)

测试工作正常,但是在断言执行逻辑之前运行的方法主要通过以下方式将各种消息打印到控制台puts.

是否有一种快速的,可能是内置的方式来抑制输出到控制台?我只对该方法对模型对象的最终影响感兴趣,并且为了保持控制台基本清洁,我希望找到一种方法来简单地阻止所有输出到控制台而无需重写或注释掉那些puts仅供我测试的陈述.

这绝对不是一个关键问题,但非常希望听到任何想法或想法(或解决方法).

cld*_*ker 32

我在测试中使用以下代码片段来捕获和测试STDOUT

def capture_stdout(&block)
  original_stdout = $stdout
  $stdout = fake = StringIO.new
  begin
    yield
  ensure
    $stdout = original_stdout
  end
  fake.string
end
Run Code Online (Sandbox Code Playgroud)

使用这种方法,上面将成为:

def executing_a_signal
  capture_stdout { a_method(a_signal.new, a_model, a_helper) }
  assert_equal(new_state, a_model.state)
end
Run Code Online (Sandbox Code Playgroud)


ndn*_*kov 7

对@ cldwalker的解决方案略微更清晰:

def silenced
  $stdout = StringIO.new

  yield
ensure
  $stdout = STDOUT
end

silenced do
  something_that_prints
end
Run Code Online (Sandbox Code Playgroud)