2013-07-25 5 views
1

랙 애플리케이션 (특히 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을 이와 같이 설정했지만, 그 안에 무엇이 있는지 스캔 할 수 있도록 보내는 로그를 캡처하는 방법을 알 수 없습니다! 어떤 아이디어?

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/)} 

을 사용자 정의 로거 대신 STDERR의 기본 로거 (예 : env['rack.errors'])를 쓰는 경우, 그 대신 해당 객체의 write 메소드를 스텁 (stub)합니다. 저는 그 예를 보여 주었을 지 모르지만 RSpec 테스트에서 Rack 환경을 유지하는 방법을 알 수는 없습니다.

이 구현에 대한 참고 사항 몇 :

STDERR.should_receive(:write).any_number_of_times 같이 any_number_of_times의 사용은, stub
  • 의 찬성되지 않습니다
    • 을하지 않는 문자열에 맞게 합리적인 정규식 없다에는 특정 문자열이 들어 있으므로 양식을 사용하는 것이 적절하지 않습니다. STDERR.stub(:write).with(/regex/)
  • +0

    완벽한 - 감사합니다! –

    +0

    나를 위해,이 답변은 누군가가 "RSpec 테스트에서 랙 환경을 유지하는 방법"을 설명하면 완벽 할 것입니다. – sheldonh