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設定しました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
4

1 に答える 1

1

カスタム ロガーが出力を書き込むために呼び出しているメソッドに期待値をスタブして設定する必要があります。

したがって、たとえば、カスタム ロガーがSTDERR単一の引数で直接書き込む場合は、次を使用します。

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

カスタム ロガーが STDERR ではなくデフォルト ロガー (つまり ) に書き込む場合は、代わりにそのオブジェクトenv['rack.errors']のメソッドをスタブします。writeその例を示したかったのですが、RSpec テスト内で Rack 環境を把握する方法がわかりません。

この実装に関するいくつかの注意事項:

  • any_number_of_timesas in の使用STDERR.should_receive(:write).any_number_of_timesは推奨されていません。stub
  • 特定の文字列を含まない文字列に一致する合理的な正規表現はないため、次の形式を使用する合理的な方法はありません。STDERR.stub(:write).with(/regex/)
于 2013-07-28T16:21:24.300 に答える