5

私はdevise / omniauthを使用してfacebook経由でログインできるようにするRails 4アプリケーションを持っています。アプリケーションは機能しているようで、テストも機能しているようです。ただし、ユーザーがFacebook経由でログインする状況をチェックするテストが1つありますが、許可を与えないことにしました。

このテストは正しく機能しますが、エラー メッセージが rspec 出力に送信されます

$ rspec -fd --tag inspect 
Sign in with facebook
  new user
E, [2013-10-20T21:25:24.232573 #17137] ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials encountered
    does not grant permission

Finished in 0.21152 seconds
1 example, 0 failures

Randomised with seed 52495

また

$ rspec 
....E, [2013-10-20T21:25:24.232573 #17137] ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials encountered.
............................................................

Finished in 0.95531 seconds
74 examples, 0 failures

Randomized with seed 2946

関連するテスト

require 'spec_helper.rb'

feature "sign in with facebook" do
  context "new user" do
    scenario "does not grant permission", inspect: true do
      dont_sign_in_with_facebook
      expect(notice_area).to have_content "Could not authenticate you from Facebook because \"Invalid credentials\""
    end
  end
end

および authentication_helper

module Features
  module AuthenticationHelpers
    def dont_sign_in_with_facebook
      OmniAuth.config.test_mode = true
      OmniAuth.config.mock_auth[:facebook] = :invalid_credentials
      visit "/users/auth/facebook"
    end
  end
end

rspec出力からのエラーメッセージを抑制するためにできることはありますか?

編集

@Shepmaster で説明されている無音機能を実装しようとしましたが、問題は解決しませんでした。次に、rspec コマンドからエラーをリダイレクトしようとしました。

rspec -fd --tag inspect  2> /dev/null
Sign in with facebook
  new user
E, [2013-10-20T21:25:24.232573 #17137] ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials encounterd
    does not grant permission

Finished in 0.21152 seconds
1 example, 0 failures

Randomised with seed 65190

および標準出力のリダイレクト

rspec -fd --tag inspect  > /dev/null

出力なし!

そして最後に出力オプションを使用する

rspec -fd --tag inspect -o /tmp/rspec.out 2> /dev/null
cat /tmp/rspec.out 

Sign in with facebook
  new user
    does not grant permission

Finished in 0.21152 seconds
1 example, 0 failures

Randomised with seed 65190

@shepmaster からの回答を使用した回答

module Features
  module AuthenticationHelpers
    def dont_sign_in_with_facebook
      OmniAuth.config.test_mode = true
      OmniAuth.config.mock_auth[:facebook] = :invalid_credentials
      silence_omniauth {visit "/users/auth/facebook"}
    end
  end
end
4

2 に答える 2

12

Rails 4.2 アプリでも同じ問題が発生しました。修正は、README に従って初期化子で OmniAuth ロガーを Rails ロガーに設定することでした。

# config/initializers/omniauth.rb
OmniAuth.config.logger = Rails.logger
于 2015-01-05T03:59:46.683 に答える
6

最善の策は、そのエラーを出力しているコードを見つけることです。そうすれば、そのエラーを黙らせる正確な方法があるかどうかを判断できます。

そのエラー メッセージには、 devise sourceでは発生していないように見える (または発生したことがない) 固有のスペルミス (encountererd) があります。おそらく、それはあなたのコードまたは別の宝石から来ていますか? 簡単な github 検索では、有用な結果は得られませんでした。

追加した

エラーを正確にコピー アンド ペーストしなかったようです。そのため、決して発生しない文字列を探していました。これがエラーの原因です。テストの間、OmniAuth ロガーを別のものに設定できるはずです。silenceこれは、以下と同じスタイルです。

def silence_omniauth
  previous_logger = OmniAuth.config.logger
  OmniAuth.config.logger = Logger.new("/dev/null")
  yield
ensure
  OmniAuth.config.logger = previous_logger
end

オリジナル

メッセージのソースが見つからない場合は、核となるオプションが常にあります。つまり、そのテスト中に標準出力ストリームへの出力を完全に無効にします。この他のSOの質問には、それを行う方法の例があり、ここで変更して再現します:

def silence
  previous_stdout, $stdout = $stdout, StringIO.new
  previous_stderr, $stderr = $stderr, StringIO.new
  yield
ensure
  # Restore the previous values of stdout and stderr
  $stdout = previous_stdout
  $stderr = previous_stderr
end

# And in your test
it 'does whatever' do
  silence { code.that_causes.the_warning }
end

繰り返しますが、より狭いソリューションを見つける方がはるかに優れています。stdout / stderr をサイレンシングすると、テスト中にデバッグ情報を出力し、何も表示されないときに、間違いなく誰かを混乱させるでしょう。ちょうど先週私に起こったので、私はこれを言います。:-)

于 2013-10-26T14:08:39.983 に答える