1

私は RSpec を初めて使用し、Devise が機能していることを示す簡単なテストを作成しようとしています。ランダムなページを選んで、ログインしていないユーザーが /users/sign_in にリダイレクトされることを示すテストを作成したいと考えています。

describe OrgsController do

  describe "GET index when not logged in" do
    it "redirects to new_user_session_path" do
      user = FactoryGirl.create(:user)
      user.confirm!
      sign_in user
      sign_out user
      get :index
      response.should redirect_to new_user_session_path
    end
  end

  before(:each) do
    user = FactoryGirl.create(:user)
    user.confirm!
    sign_in user
  end

  # remaining specs

end

私は得る"Expected response to be a redirect to <http://test.host/users/sign_in?locale=en> but was a redirect to <http://test.host/users/sign_in>."

私は i18n を実装しており、アプリケーション コントローラに次のものがあります。

before_filter :set_i18n_locale_from_params

これを機能させるための最良の方法は次のとおりです。

  • ルートを一致させるには?
  • before(:each) ブロックの影響を回避するためにユーザーをサインインおよびサインアウトするというハックさは?
  • 全体的なアプローチは?
4

1 に答える 1

3

コントローラーのテスト/仕様でロケールを適切に設定する問題は長年の問題です。次を参照してください:機能テスト用にロケールの default_url_options を設定する方法 (Rails)

あなたが書いたことから、コントローラーのテスト/仕様からは機能しないget :indexため、デフォルトでロケールを設定していないようです。default_url_options上記のリンクに記載されている解決策のいずれかを試して、ルートを一致させてください。github に関するこのディスカッションも参照してください: https://github.com/rspec/rspec-rails/issues/255

価値があるのは、これは現在仕様/テストで現在使用しているパッチで、現在のロケールからルートにロケールが自動的に渡されるようにするためです。

class ActionDispatch::Routing::RouteSet
  def url_for_with_locale_fix(options)
    url_for_without_locale_fix(options.merge(:locale => I18n.locale))
  end

  alias_method_chain :url_for, :locale_fix
end

あなたが持っているブロック設定のハックさに関しては、before(:each)コンテキストブロックを使用してケースを分離することを本当にお勧めします.1つのコンテキストでは、ユーザーがログインする前のフィルターがなく、別のコンテキストではユーザーがログインする前のブロックがあります。何が起こっているのかを見ようとしている人にとって、今は本当に混乱しています。

于 2012-09-13T21:21:49.480 に答える