收集Rack :: Test中的日志

时间:2013-07-25 09:09:19

标签: ruby rspec rack rack-test

我有一个机架应用程序(特别是Sinatra的应用程序,但我认为不重要),当正常运行时,它会愉快地向STDOUT输出一些关于它的请求的信息,例如:

127.0.0.1 - - [25/Jul/2013 10:05:39] "GET /oath2/token?password=ohnoes HTTP/1.1" 404 507 0.0013

我正在尝试编写Rack::CommonLogger的扩展名,该扩展名将从日志文件中删除密码,因此我的第一个任务当然是编写测试。

rack/test设置了rspec,但我无法弄清楚如何捕获传出日志,以便我可以扫描其中的内容!有什么想法吗?

require 'my_webapp'

describe "My Webapp" do
  include Rack::Test::Methods

  def app
    @app ||= MyWebapp.new
  end

  it 'should not log the text of any GET password parameter' do
    get '/oauth2/token?password=ohnoes'

    # Not sure about this!

    log_output.should_not =~ /ohnoes/
  end
end

1 个答案:

答案 0 :(得分:1)

您需要对自定义记录器调用其输出的任何方法存根并设置期望。

因此,例如,如果您的自定义记录器使用单个参数直接写入STDERR,您将使用:

STDERR.stub(:write) {|arg| expect(arg).to_not match(/password/)}

如果您的自定义记录器写入默认记录器(即env['rack.errors'])而不是STDERR,那么您将存根该对象的write方法。我会展示这个例子,但我无法弄清楚如何在RSpec测试中掌握Rack环境。

关于此实施的几点说明:

  • 使用any_number_of_times,如 {$ 1}}已被弃用 赞成STDERR.should_receive(:write).any_number_of_times
  • 没有合理的正则表达式匹配字符串 包含特定的字符串,所以没有合理的方法 使用表格stub