1

私のレールアプリで私はユーザ認証にdeviseを使用しています。私はまた、ウェブサイト全体にi18nを使用しており、各ユーザーはユーザー設定で自分または特定の言語を選択する可能性があります。ユーザーが指定されたロケールセットを持つWebサイトを参照するか、またはゲストであり、デフォルトのロケールが使用されている場合、そのロケールをURLに表示しないようにします。rspecサポートファイルの拡張クラスで最新のdeviseユーザを取得

ここでは例です:URLが「anything.com/users/42」のようなものであるので、彼女または彼はでない恒久的(フランス語に変更された場合

ゲストは、英語(デフォルト)バージョンを使用していますたとえばフランス語版へのリンクをクリックすると、URLは「anything.com/fr/users/42」に変わります。そのユーザーがログインしていて、既定の言語としてフランス語を選択した場合、それは逆です。

これは、これは私のアプリで完璧に動作し、私のapplication_controller

# app/controllers/application_controller.rb 
def default_locale 
    current_user ? current_user.locale : I18n.default_locale 
end 
helper_method :default_locale 

def default_url_options options={} 
    (I18n.locale.to_s.eql?(default_locale.to_s) ? { locale: nil } : { locale: I18n.locale }).merge options 
end 

に以下の行によって実現されます。

しかし、テストするときに問題があります。リダイレクトをチェックするために

visit edit_league_path(@league) 
expect(page.current_path).to eq league_path(@league) 

:いくつかのテストでは、私はLeagueという名前の既存のモデルのために、このような表現を持っています。リーグのためのアクションeditは、管理者だけに許可されます。

私が使用しているので、私は次のメソッドを持つ前に、(管理者でない)ユーザーでログインしている工夫:

# spec/support/controller_macros.rb 
module ControllerMacros 
    def login_user *user_roles 
    before(:each) do 
     @request.env['devise.mapping'] = Devise.mappings[:user] 
     user = FactoryGirl.create(:user, *user_roles) 
     user.confirmed_at = Time.zone.now 
     user.save 
     sign_in user 
    end 
    end 
end 

ユーザーのための工場がランダムなロケールを持つランダムなユーザーが作成されます。

Iも(hereを議論したように)application_controllerからdefault_url_optionsはRSpecのテストでは無視されているので、RSpecのテストのためのローカライズを修正したサポートファイルを、持っている:

# spec/support/fix_localization.rb 
# workaround, to set default locale for ALL spec 
class ActionView::TestCase::TestController 
    def default_url_options options={} 
    { locale: I18n.locale }.merge options 
    end 
end 

class ActionDispatch::Routing::RouteSet 
    def default_url_options options={} 
    { locale: I18n.locale }.merge options 
    end 
end 

今私の問題は、そのデフォルトのi18nロケールセット(たとえばen)を持つログインユーザーが、リーグの編集ページにアクセスすると、そのページを訪問することが許可されていないため、リダイレクトされます。リダイレクトではdefault_url_optionsメソッドがapplication_controllerであるとみなされ、/en/leagues/42(テストのとおり)にリダイレクトされませんが、/leagues/42にリダイレクトされます。この問題への

私のソリューションは、application_controllerと同じにspec/support/fix_localization.rbdefault_url_options方法を変更することですが、私はサポートファイルの現在のユーザーにアクセスすることはできません。

現行のユーザーにアクセスする方法や、自分の問題の別のアイデアや回避策を知る方法はありますか?

ありがとうございます!

答えて

0

コードを複製せずに解決策を見つけました。

# spec/support/fix_localization.rb 
# workaround, to set default locale for ALL spec 
class ActionView::TestCase::TestController 
    def default_url_options options={} 
    subject.default_url_options options 
    end 
end 

だから今、ApplicationControllerから継承され、現在使用されているコントローラ(subject)からdefault_url_options方法が使用されている:私はちょうど私にspec/support/fix_localization.rbファイルを変更しました。

これは技術的には私の質問には答えませんが、根本的な問題を解決します。

subject.current_user 

をしかし、これは、被験者が、コントローラでサポートファイルでのみ使用可能です。(本来は尋ねたとして)現在のユーザーを取得するには、1にもsubjectを使用することができます。

関連する問題