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)
我已将日志消息输出到终端,但两次验证均失败
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)
| 归档时间: |
|
| 查看次数: |
2061 次 |
| 最近记录: |