9

これは、次の環境でのコントローラー仕様の Cookie コレクションの問題です。

  • レール 3.1.0.rc4
  • rspec 2.6.0
  • rspec-rails 2.6.1

Factory ユーザーを作成し、Cookie を設定するサインイン メソッドを呼び出し、サインインしたユーザーがページにアクセスできるかどうかをテストする単純なコントローラー仕様があります。問題は、認証 Cookie が設定されてからコントローラーで「表示」アクションが呼び出されるまでの間、すべての Cookie が消えているように見えることです。

私のコードは、Rails dev サーバーのブラウザーで実行すると正常に動作します。仕様の実行中のさらに奇妙な動作は、cookie ハッシュを介して設定されたものはすべて消えますが、セッション ハッシュを介して設定されたものはすべて存続することです。rspec を使用するときに Cookie がどのように機能するかについて、何か不足しているだけですか?

仕様コード

it "should be successful" do
  @user = Factory(:user)
  test_sign_in @user
  get :show, :id => @user
  response.should be_success
end

サインインコード

def sign_in(user, opts = {})
  if opts[:remember] == true
    cookies.permanent[:auth_token] = user.auth_token
  else
    cookies[:auth_token] = user.auth_token
  end
  session[:foo] = "bar"
  cookies["blah"] = "asdf"
  self.current_user = user
  #there are two items in the cookies collection and one in the session now
end

Cookie[:auth_token] が nil であるため、get :show リクエストの認証チェックはここで失敗します

def current_user
 #cookies collection is now empty but session collection still contains :foo = "bar"... why?
 @current_user ||= User.find_by_auth_token(cookies[:auth_token]) if cookies[:auth_token]
end

これはバグですか?私が理解できないのは、ある種の意図された動作ですか?明らかなことを見過ごしているだけですか?

4

3 に答える 3

7

これが私がこれを解決した方法です:

def sign_in(user)
 cookies.permanent.signed[:remember_token] = [user.id, user.salt]
 current_user = user
 @current_user = user
end

def sign_out
 current_user = nil
 @current_user = nil
 cookies.delete(:remember_token)
end

def signed_in?
 return !current_user.nil?
end

何らかの理由で、Rspec で動作させるには @current_user と current_user の両方を設定する必要があります。理由はわかりませんが、ブラウザで正常に動作していたので、完全に気が狂いました。

于 2011-09-26T19:02:57.780 に答える
3

同じ問題に遭遇しました。@request.cookie_jarテストから使用してみてください。

于 2011-07-25T20:13:18.007 に答える
2

上記の余分な行は必要ありません。self.current_user = userセッター メソッドを呼び出すだけで、インスタンス変数を自動的に更新できることがわかりました。何らかの理由で、self なしで呼び出すと、setter メソッドが呼び出されません。

余分な行を除いた私のコードは次のとおりです。

def sign_in(user)
  cookies.permanent.signed[:remember_token] = [user.id, user.salt]
  self.current_user = user
end

def sign_out
  cookies.delete(:remember_token)
  self.current_user = nil
end

def current_user=(user)
  @current_user = user
end

理由はまだわかりません。Rspec のバグかもしれません。

于 2012-01-17T04:16:49.757 に答える