例如,它生成了一个log(my_work.log)内容:
I, [2015-05-14T00:00:00.000000 #5590] INFO -- : Work started.
我想测试my_work.log是否包含内容Work started.
,怎么办?
我不想匹配所有行包含日期时间,因为它包含#5590
,我不能将其存根。
答案 0 :(得分:5)
初始化Logger时,您可以传入StringIO的实例以捕获输出,然后匹配预期的内容:
require 'logger'
describe "log" do
let(:log) { StringIO.new }
let(:logger) { Logger.new(log) }
let(:expected) { "Work started" }
it "should add the expected content to the log" do
logger.info(expected)
log.rewind
expect(log.read).to match(/.+#{expected}$/)
end
end
答案 1 :(得分:2)
Rails.logger
使用一些方法来记录事物,例如:
因此,在您的情况下,您使用info
来记录某些内容,而不是寻找匹配项,您可以检测是否调用了方法info
:
it 'logs exception' do
# some code
expect(Rails.logger).to receive(:info)
# execute the line that logs something
end
即使您可以使用保留字receive
向with
方法添加参数:
expect(Rails.logger).to receive(:info).with('Work started.')
这导致你需要指定一些东西
答案 2 :(得分:1)
使用RSpec' output matcher(在3.0中引入),您可以执行以下操作:
expect { my_method }.to output("my message").to_stdout
expect { my_method }.to output("my error").to_stderr
对于Logger
或Logging
等库,您可能必须使用output.to_<stdout/stderr>_from_any_process
。
它简单,干净,并会测试您的消息是否实际到达输出。