我有一个非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
我向终端输出了日志消息,但两次验证均失败
答案 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")