rails-devise-punditサンプル アプリを使用して、RailsApps からスターター アプリを作成しました。いくつかの機能を変更する予定があり、まだ機能することを確認したいので、ユーザーコントローラーテストを作成しようとしています。専門家の UserPolicy は、User クラスのロール列挙に基づく正しい値を返しません。UserPolicy.index? 以下に示すメソッドは、UsersControllerTest の最初のテストから呼び出されたときに false を返しています。申し訳ありませんが、ここには多くのコードと詳細があります。誰もがそれに従うことを願っています。
UsersControllersTest の失敗したテストを次に示します。応答は、:success ではなく :redirect です。
require "test_helper"
class UsersControllerTest < ActionController::TestCase
def setup
@admin = users(:admin)
@admin.role = :admin
end
test "should get index page when authenticated as an admin" do
sign_in @admin
get :index
assert_response :success
end
...
end
これは、私の問題があるインデックスメソッドを示しているだけのユーザーコントローラークラスです。メソッドauthorize @users
を呼び出す必要があります。UserPolicy.index?
class UsersController < ApplicationController
before_filter :authenticate_user!
after_action :verify_authorized, except: [:show]
def index
@users = User.all
authorize @users
end
...
end
私の専門家のユーザー ポリシー クラス。true を返すようにメソッドを変更するindex?
と、UsersControllerTest の応答は :success になります。したがって、何らかの理由@user.admin?
で正しい値が返されません。
class UserPolicy
attr_reader :user, :record
def initialize(user, record)
@user = user
@record = record
end
def index?
@user.admin?
end
...
end
さらに奇妙なのは、UserPolicyTest クラスを作成し、index?
そこからの呼び出しをテストすると、正しい応答が得られることです。このテストは正しく動作します:
require 'test_helper'
class UserPolicyTest < ActiveSupport::TestCase
def setup
@admin = users(:admin)
@admin.role = :admin
end
def test_index
policy = UserPolicy.new @admin, nil
assert policy.index?
end
end
ここに私のユーザーモデルがあります:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable, :confirmable,
:recoverable, :rememberable, :trackable, :validatable
enum role: [:user, :vip, :admin]
after_initialize :set_default_role, :if => :new_record?
validates :name, presence: true
def set_default_role
self.role ||= :user
end
end
管理者ユーザー向けの私のテストフィクスチャは次のとおりです。
admin:
email: admin@example.com
name: Mr Admin
role: admin
encrypted_password: $2a$10$PoBe1MvkoGJsjMVTEjKqgeBUp.xdfzWoiDjBzQhtLAj16NqIa2fOy
remember_created_at: nil
sign_in_count: 3
current_sign_in_at: 2014-01-02 08:31:23
last_sign_in_at: 2014-01-02 08:31:23
current_sign_in_ip: 127.0.0.1
last_sign_in_ip: 127.0.0.1
confirmation_token: nil
confirmed_at: 2014-01-02 08:31:23
confirmation_sent_at: 2014-01-02 08:30:59
created_at: 2014-01-02 08:30:59
updated_at: 2014-01-02 08:31:23
フィクスチャで役割を設定しても機能しないことがわかりました。after_initialize :set_default_role, :if => :new_record?
User モデルの行が原因だと思います。他の理由や、これを処理するためのより良い方法があれば、お知らせください。
更新: 強力なパラメータが原因である可能性があります。pry を使用してコードをデバッグしようとしたところ、UsersControllerTest で、サインイン後に管理者ユーザーのロールが 2 であることがわかりました。これは正しいです。しかし、User.Policy.index? に到達したとき、ロールは 0 でした。ロール フィールドをデバイスの強力なパラメータに追加する必要があるかもしれません。しばらく前に、その方法について何かを見ました。簡単には見えませんでした。私がそれにたどり着く前に誰かが答えを知っているなら、私に知らせてください。