2013-07-25 1 views
1

У меня есть приложение стойки (в частности, Sinatra one, но я не думаю, что это важно), который при нормальной работе с радостью выводит кучу информации о запросах, которые производятся это 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 
+0

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

ответ

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/)
+0

Perfect - спасибо! –

+0

Для меня этот ответ был бы идеальным, если бы кто-то объяснил, «как удержать среду Rack в тесте RSpec». – sheldonh