Сбор журналов внутри стойки:: Тест
У меня есть стоечное приложение (в частности, 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/)