インデックスアクションがパスワードで保護されているコントローラーがあります。
class Admin::UsersController < Admin::BaseController
before_action :signed_in_user
def index
@users = User.all
end
end
私はテストをしています:
test "should get index" do
get :index
assert_response :success
assert_not_nil assigns(:users)
end
実行時にユーザーがサインインページにリダイレクトされるため、テストは失敗します。
def signed_in_user
unless signed_in?
redirect_to signin_url, notice: "Please sign in."
end
end
def signed_in?
!current_user.nil?
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
def current_user=(user)
@current_user = user
end
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
def current_user?(user)
user == current_user
end
私はcapybaraを使用してサインインページにアクセスし、テストユーザーにログインできることを知っていますが、私の経験では、これは通常、実行に時間がかかるテストスイートにつながるため、これを行うための迅速で汚い方法があるかもしれないと思っていましたセッションの使用:
test "should get index" do
get :index, { }, { remember_token: users(:one).remember_token }
assert_response :success
assert_not_nil assigns(:users)
end
# I also tried the following:
test "should get index" do
get :index, { }, { current_user: users(:one) }
assert_response :success
assert_not_nil assigns(:users)
end
上記でテストユーザーが魔法のようにログインすることを期待していましたが、そうではありません。テストが失敗すると、サインインページにリダイレクトされます。
この種のことを行う正しい方法は何ですか?それは私を狂わせています。