我正在测试这个类,它在控制台上显示了一些消息(带有puts、p警告等).我只是想知道,在RSpec测试期间,是否有能力 suppress 这种输出?

推荐答案

我通过将$stout重定向到文本文件来 suppress 类中的puts个输出.这样,如果出于任何原因我需要查看输出,它就在那里,但不会弄脏我的测试结果.

#spec_helper.rb
RSpec.configure do |config|
  config.before(:all, &:silence_output)
  config.after(:all,  &:enable_output)
end

public
# Redirects stderr and stout to /dev/null.txt
def silence_output
  # Store the original stderr and stdout in order to restore them later
  @original_stderr = $stderr
  @original_stdout = $stdout

  # Redirect stderr and stdout
  $stderr = File.new(File.join(File.dirname(__FILE__), 'dev', 'null.txt'), 'w')
  $stdout = File.new(File.join(File.dirname(__FILE__), 'dev', 'null.txt'), 'w')
end

# Replace stderr and stdout so anything else is output correctly
def enable_output
  $stderr = @original_stderr
  $stdout = @original_stdout
  @original_stderr = nil
  @original_stdout = nil
end

EDIT:

作为对@MyronMarston comments 的回应,直接将方法作为块插入beforeafter可能会更明智.

#spec_helper.rb
RSpec.configure do |config|
  original_stderr = $stderr
  original_stdout = $stdout
  config.before(:all) do 
    # Redirect stderr and stdout
    $stderr = File.new(File.join(File.dirname(__FILE__), 'dev', 'null.txt'), 'w')
    $stdout = File.new(File.join(File.dirname(__FILE__), 'dev', 'null.txt'), 'w')
  end
  config.after(:all) do 
    $stderr = original_stderr
    $stdout = original_stdout
  end
end

它看起来有点干净,并且不允许使用main种方法.

EDIT2

还应该提到的是,您可以使用Ruby v 1.9.3中引入的File::NULL转发到真正的os /dev/null.(jruby 1.7)

然后代码片段将如下所示:

#spec_helper.rb
RSpec.configure do |config|
  original_stderr = $stderr
  original_stdout = $stdout
  config.before(:all) do
    # Redirect stderr and stdout
    $stderr = File.open(File::NULL, "w")
    $stdout = File.open(File::NULL, "w")
  end
  config.after(:all) do
    $stderr = original_stderr
    $stdout = original_stdout
  end
end

Ruby相关问答推荐

使用 RSpec 测试嵌套哈希时随机排序数组的匹配

类似于模块的 attr_accessor 和 attr_reader 的东西?

Rb:仅通过在 Ruby 中的类上添加 each 方法,可枚举模块是如何工作的?

while 语句的主体是块吗?

使用 Drive API 创建空文件

Ruby 符号到类

Simple_form:删除带有标签的内联复选框的外部标签

从单独的文件中包含一个 Ruby 类

出于调试目的,如何打印有关 NET:HTTPRequest 的信息?

将一个目录的内容复制到另一个目录

为什么 RuboCop 建议用 Array.new 替换 .times.map?

比较ruby中的两个字符串

Ruby 输出 Unicode 字符

如何在 Ruby 中解冻对象?

RSpec:每次指定对具有不同参数的方法的多次调用

`respond_to?` 与 `respond_to_missing?`

如何按字母顺序排列忽略大小写的数组?

为什么 Ruby 的 Date 类会自动加载,但 DateTime 不会?

在 Ruby 中,获取数组中最大值的索引的最简洁方法是什么?

Integer 和 Fixnum 有什么区别?