Rspec 无法检查记录器信息输出

Sho*_*eNN 6 ruby logging rspec

我有一个非 Rails ruby​​ 应用程序,它使用记录器来处理到标准输出的日志输出。
我想添加用于检查输出的规范,并找到了两种实现此目的的方法,但似乎这两种方法都不起作用。

所以这两种方式都在这个spec.rb文件中:

require 'rspec' 
require 'logger'

describe 'Logger' do   
  it 'expect to output' do
    expect { Logger.new(STDOUT).info('Hello') }.to output.to_stdout    
  end

  it 'expect to recieve' do
    expect(Logger.new(STDOUT).info('Hello')).to receive(:info)   
  end 
end
Run Code Online (Sandbox Code Playgroud)

我已将日志消息输出到终端,但两次验证均失败

jma*_*bia 5

STDOUT用。。。来代替$stdout。这有效:

expect { Logger.new($stdout).info('Hello') }.to output.to_stdout
Run Code Online (Sandbox Code Playgroud)

原因是 Rspec 在内部修改全局变量$stdout以使用StringIO. 当使用常量时,这种机制不起作用,因为STDOUT保留了 的原始值$stdout

请注意,如果您在块之外初始化记录器,您将遇到类似的问题。记录器对象将在内部存储原始引用,但它不起作用:

logger = Logger.new($stdout)
expect { logger.info('Hello') }.to output.to_stdout # This won't work
Run Code Online (Sandbox Code Playgroud)

根据第二个问题:

expect(Logger.new(STDOUT).info('Hello')).to receive(:info)   
Run Code Online (Sandbox Code Playgroud)

这只是 Rspec 的错误用法。它应该是这样的:

logger = Logger.new(STDOUT)
expect(logger).to receive(:info)   
logger.info("Hello")
Run Code Online (Sandbox Code Playgroud)