ja ja ja ja de ja ja ja ja ja ja zh ja en ja ja ja en ja ja pt ja ja en en en la ja ja ja pt ja ja en de nl ja en ja ja sv ja ja nb fr ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja
context 'ログインに失敗したとき' do around do |example| original_mock_auth = OmniAuth.config.mock_auth[:twitter] OmniAuth.config.mock_auth[:twitter] = :invalid_credentials visit root_path click_link 'Twitterでログイン' example.run OmniAuth.config.mock_auth[:twitter] = original_mock_auth end it '"ログインに失敗しました"と表示されること' do expect(page).to have_content 'ログインに失敗しました' end end
これまでは普通にテストが通っていたのでなんだろうと思って調べた。
OmniAuthはデフォルトの挙動して、RACK_ENVがdevelopmentのときに単にOmniAuth::Errorを投げる設定になっている
omniauth/failure_endpoint.rb at 8179ba796aae82f857f63b50ae848a3fbe369b4d · omniauth/omniauth
それ以外の環境ではエラー用のURLにリダイレクトする(これが期待していた挙動)
jsを利用したsystem specのときにpumaをサーバとして使っている
pumaは起動時にRACK_ENVが設定されていないと、developmentを設定する
puma/server.rb at master · puma/puma
つまりテストの実行順序の問題で、pumaの起動がOmniAuthのテストより前に来てしまうとRACK_ENVがdevelopmentになり期待していた挙動と異なる振る舞いをするようになってしまっていた。
とりあえず明示的に、次の行をconfig/rails_helper.rbに追加したところうまく動くようになった。
ENV['RACK_ENV'] ||= 'test'
これ、自分と同じようにハマる人が出てくると思うのでライブラリ側でどうにかしたいのだけど、どのライブラリにどのようにPR投げるか悩ましいですね…
rspec-rails
のどれか。rspec-railsでrails_helper.rbのテンプレートをいじってRACK_ENVもRAILS_ENVと同様に設定するようにする、というのがいいだろうか。
どこでRACK_ENVが設定されているか調べるのに使った雑なスクリプトを置いておきます
module DebugEnv def []=(*args) key = args.first if key == 'RAILS_ENV' || key == 'RACK_ENV' p args p caller end super end end ENV.singleton_class.prepend DebugEnv
あと、この手の環境変数関連のデバッグではspringは切っておいたほうが良さそう(ちゃんと調べきれてないけど、設定されていないはずのタイミングでRACK_ENVが設定されていて、これでかなり時間を奪われた><)
また、rake spec や rakeでテストを実行しているときにはこの問題は発生しなさそう。
rspec-rails/rspec.rake at master · rspec/rspec-rails
willnet 2018-09-16 23:43
n_plus_one_controlはrequest specで使うのが良いという話とrequest…
savanna.io の日報からの転載。ちゃんと整形したり説明詳しく入…
miuchee を heroku 環境に移行した
miuchee を heroku に移行したメモです。 移行理由 @mkouhei さ…
前書いてた書きかけのメモを公開 インストール方法 Octopress S…
« macで/etc/hostsに定義を追加するときの注… Turbolinks5でPOSTするときはajax経由のほ… »