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

时间:2016-11-11 14:11:11

标签: ruby logging rspec

我有一个非rails ruby​​应用程序,它使用logger来处理stdout的日志输出 我想添加规范来检查输出,并找到两种方法来实现它,似乎两种方式都不起作用。

所以两种方式都在这个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

我向终端输出了日志消息,但两次验证均失败

2 个答案:

答案 0 :(得分:2)

我通常只使用这样的双打:

describe 'logging' do
  it 'handles output' do
    logger = double('logger')
    allow(Logger).to receive(:new).and_return(logger)

    run_some_code
    expect(logger).to receive(:info).with("Hello")
  end
end

答案 1 :(得分:1)

STDOUT替换为$stdout。这有效:

expect { Logger.new($stdout).info('Hello') }.to output.to_stdout

原因是Rspec在内部修改了全局变量$stdout以使用StringIO捕获其内容。使用常量时,此机制不起作用,因为STDOUT保留了$stdout的原始值。

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

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

根据第二个问题:

expect(Logger.new(STDOUT).info('Hello')).to receive(:info)   

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

logger = Logger.new(STDOUT)
expect(logger).to receive(:info)   
logger.info("Hello")