2

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 でした。ロール フィールドをデバイスの強力なパラメータに追加する必要があるかもしれません。しばらく前に、その方法について何かを見ました。簡単には見えませんでした。私がそれにたどり着く前に誰かが答えを知っているなら、私に知らせてください。

4

1 に答える 1

0

セットアップで @admin.role の値を変更した後、ユーザーを保存しませんでした。setup メソッドに @admin.save を追加すると、テストはパスしました。

于 2014-04-05T19:31:17.117 に答える