我使用rails- devise-pundit示例应用程序从 RailsApps 创建了一个入门应用程序。我正在尝试编写一个用户控制器测试,因为我计划更改一些功能并且我想确保事情仍然有效。专家 UserPolicy 没有返回基于 User 类中角色枚举的正确值。UserPolicy.index? 当从 UsersControllerTest 中的第一个测试调用时,下面看到的方法返回 false。抱歉,这里有很多代码和细节。我希望每个人都可以跟随它。
这是 UsersControllersTest 中的失败测试。响应是 :redirect 而不是 :success。
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
我的专家用户策略类。当我更改index?
方法使其返回 true 时,我的 UsersControllerTest 中的响应是:成功。所以由于某种原因@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?
我的用户模型中的行。如果有其他原因或更好的方法来处理这个问题,请告诉我。
更新:也许这是由强参数引起的。当我尝试使用 pry 调试代码时,我发现在 UsersControllerTest 中,登录后,管理员用户的角色为 2,这是正确的。但是当它到达 User.Policy.index? 时,角色为 0。我可能需要将角色字段添加到设计强参数中。不久前我看到了一些关于如何做到这一点的东西。看起来并不容易。如果有人在我得到答案之前知道答案,请告诉我。