0
  @user = FactoryGirl.create(:user)
  @user2 = FactoryGirl.create(:user)

  @request.env["devise.mapping"] = Devise.mappings[:user]

  controller.current_user.should be_nil

  post :create, :user => {email: @user.email, password: @user.test_pass}
  flash[:alert].should be_nil
  controller.should(respond_to(:current_user))
  controller.current_user.should_not be_nil

  post :create, :user => {email: @user2.email, password: @user2.test_pass}

  flash[:alert].should be_nil
  controller.should(respond_to(:current_user))
  controller.current_user.should == @user2

最後のものは失敗します。@user2 ではなく、@user のままです。

編集:

これを行う場合、これはユーザーをログアウトしてセッションをクリアする公正な方法ですか?

class SessionsController < Devise::SessionsController

  def create
    if warden.authenticated?(:user)
      sign_out(current_user)
    end
    super
  end
end
4

1 に答える 1

1

デバイス認証の流れは非常に論理的です。サインイン/サインアップすると、リダイレクトされ、セッションが開始されてキャプチャされます。新しいセッションを開始する前に、サインアウトする必要があります。

2番目のユーザーが作成されたときに最初のユーザーをサインアウトするように要求するデフォルトのデバイス動作をテストしていることがわかりますか? devise はこれを行いませんが、アプリケーションでこれが必要な場合は、コールバック メソッド before_create を使用してください。

それが赤、緑、リファクタリングの全体的な考え方だと思います。

于 2012-09-19T10:35:02.150 に答える