我正在测试这个类,它在控制台上显示了一些消息(带有puts、p警告等).我只是想知道,在RSpec测试期间,是否有能力 suppress 这种输出?
我正在测试这个类,它在控制台上显示了一些消息(带有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 的回应,直接将方法作为块插入before
和after
可能会更明智.
#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