Сбор журналов внутри стойки:: Тест

У меня есть стоечное приложение (в частности, 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 ответ

Решение

Вам нужно заглушить и установить ожидания для любого метода, который вызывает ваш пользовательский регистратор, чтобы записать свой вывод.

Так, например, если ваш пользовательский регистратор пишет непосредственно в STDERR с одним аргументом вы бы использовали:

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

Если ваш пользовательский регистратор пишет в регистратор по умолчанию (т.е. env['rack.errors']) вместо STDERR, то вы бы заглушки write метод этого объекта вместо. Я бы показал этот пример, но я не могу понять, как овладеть средой Rack в тесте RSpec.

Несколько замечаний по этой реализации:

  • Использование any_number_of_times, как вSTDERR.should_receive(:write).any_number_of_times не рекомендуется в пользу stub
  • Не существует разумного регулярного выражения для сопоставления строк, которые не содержат конкретной строки, поэтому нет разумного способа использовать форму STDERR.stub(:write).with(/regex/)
Другие вопросы по тегам