2

我使用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。我可能需要将角色字段添加到设计强参数中。不久前我看到了一些关于如何做到这一点的东西。看起来并不容易。如果有人在我得到答案之前知道答案,请告诉我。

4

1 回答 1

0

在设置中更改@admin.role 的值后,我没有保存用户。在 setup 方法中添加@admin.save 后,测试通过了。

于 2014-04-05T19:31:17.117 回答