如何使用RSpec测试日志内容?

时间:2015-05-14 01:29:41

标签: ruby-on-rails file testing rspec

例如,它生成了一个log(my_work.log)内容:

I, [2015-05-14T00:00:00.000000 #5590]  INFO -- : Work started.

我想测试my_work.log是否包含内容Work started.,怎么办?

我不想匹配所有行包含日期时间,因为它包含#5590,我不能将其存根。

3 个答案:

答案 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

即使您可以使用保留字receivewith方法添加参数:

expect(Rails.logger).to receive(:info).with('Work started.')

这导致你需要指定一些东西

检查rspecrails logger

同时检查this stackoverflow post

答案 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

对于LoggerLogging等库,您可能必须使用output.to_<stdout/stderr>_from_any_process

它简单,干净,并会测试您的消息是否实际到达输出。