【问题标题】:Gathering Logs within Rack::Test在 Rack::Test 中收集日志
【发布时间】:2013-07-25 09:09:19
【问题描述】:

我有一个机架应用程序(特别是一个 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/testrspec,但我不知道如何捕获传出日志,以便我可以扫描其中的内容!有什么想法吗?

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

【问题讨论】:

  • 您是否可以共享该记录器 - 我们需要相同的机架解决方案。

标签: ruby rspec rack rack-test


【解决方案1】:

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

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

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

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

关于这个实现的几点说明:

  • any_number_of_times 的使用,如 STDERR.should_receive(:write).any_number_of_times 已弃用 赞成stub
  • 没有合理的正则表达式来匹配字符串 not 是否包含特定的字符串,所以没有合理的方法来 使用表格STDERR.stub(:write).with(/regex/)

【讨论】:

  • 对我来说,如果有人解释“如何在 RSpec 测试中掌握 Rack 环境”,这个答案将是完美的。
猜你喜欢
  • 2018-01-26
  • 2011-07-17
  • 2023-03-02
  • 1970-01-01
  • 2021-09-08
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多