当您require 一个文件时,您实际上是在“运行它”。这就是您的测试如何知道 something 方法已定义 - 因为它已经初始化了定义。
我想你真正要问的是如何在requireing 文件时使puts 命令静音。有几种可能的方法 - 这里有一些建议:
不要直接使用puts。一种非常粗略但简单的方法可能是将这些调试消息包装为辅助方法 - 例如:
# something.rb:
def debug(message)
unless $debug_messages_disabled
puts message
end
end
def something(x)
x = x * 1
end
debug "something"
# in your spec (spec_helper.rb?):
$debug_messages_disabled = true
但是,这种方法根本无法很好地扩展......
更好的方法是使用use a Logger 而不是puts。如果您选择登录到文件,那么您的问题已经解决了!而且,如果您坚持记录到stdout,那么您可以在运行测试时简单地增加日志级别 - 只要您有一种方便的方法来设置此日志级别。比如:
# something.rb:
# ...
MyApplication.logger.debug "something" # NOT `puts`
# config/environments/development.rb
config.log_level = :debug
# config/environments/test.rb
config.log_level = :warn
...但是这种方法可能要为这样的单个文件设置太多的努力!
这导致了隐藏这些puts 命令的输出的最后一个简单的选项:Suppress the STDOUT in your tests。
您可以通过 only 存根 puts 命令来实现此目的:
# spec_helper.rb
before do
IO.any_instance.stub(:puts) # globally
YourClass.any_instance.stub(:puts) # or for just one class
end
或者,对于更通用的解决方案,您可以阻止 all STDOUT:
#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