2

インデックスアクションがパスワードで保護されているコントローラーがあります。

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

上記でテストユーザーが魔法のようにログインすることを期待していましたが、そうではありません。テストが失敗すると、サインインページにリダイレクトされます。

この種のことを行う正しい方法は何ですか?それは私を狂わせています。

4

1 に答える 1

0

この質問のおかげで修正されました。必要なのは:

setup do
  @user = users(:one)
  # since I am using cookies, I just need to set them here
  @request.cookies['remember_token'] = @user.remember_token
end

# no need to pass anything to the get method
test "should get index" do
  get :index
  assert_response :success
  assert_not_nil assigns(:users)
end
于 2013-03-03T16:35:17.317 に答える