如何测试连接表的能力?

how testing ability for joins tables?

请帮忙解决问题。我使用 gem 'cancan' 并加入 table 的角色层次结构。 架构:

create_table "roles", force: :cascade do |t|
  t.string   "name",       limit: 255
end

create_table "roles_users", id: false, force: :cascade do |t|
  t.integer "role_id", limit: 4
  t.integer "user_id", limit: 4
end

create_table "users", force: :cascade do |t|
  t.string   "email",                  limit: 255, default: "", null: false
  t.string   "encrypted_password",     limit: 255, default: "", null: false
end

我有 3 个角色: table 个角色:

id        name
0         user
1         manager
2         admin

我创建了 3 个用户并给了他们角色: table roles_users:

role_id         user_id
2               2
1               3
0               1

ability.rb:

class Ability
  include CanCan::Ability
  def initialize(user)
    user ||= User.new # guest user (not logged in)

    if user.role? :admin
      can :manage, :all
      cannot :update, Review
    elsif user.role? :manager
      can :read, Review
      can :create, Review
      can :update, Review
      cannot :delete, Review
    elsif user.role? :user
      can :read, Review
      can :create, Review      
      cannot :update, Review
      cannot :delete, Review
    else
      can :read, Review
      cannot :create, Review
      cannot :update, Review
      cannot :delete, Review
    end   
  end   
end   

工厂:

FactoryGirl.define do
  factory :user do
    sequence(:email){ |i| "us#{i}@ad.ad" }
    password 'qwertyui'
    password_confirmation{ |u| u.password }    
  end 
end

FactoryGirl.define do
  factory :admin_status, class: Role do
    role_id 2
    user_id 2
  end

  factory :manager_status, class: Role do
    role_id 1
    user_id 3
  end

  factory :user_status, class: Role do
    role_id 0
    user_id 1
  end

end

我需要通过 r 规范测试管理员用户的能力:

require 'rails_helper'

RSpec.describe Review, type: :model do
  before(:each) do
    @user = FactoryGirl.create(:user) #create admin
    @ability = Ability.new(@user)
  end

  it "cannot delete review" do
    expect(@ability).to be_able_to(:delete, Review)
  end  
end

但在 运行 测试控制台显示以下错误消息后:

kalinin@kalinin ~/rails/admin_book $ rspec spec/models/review_spec.rb
F
Failures:
  1) Review cannot delete review
     Failure/Error: expect(@ability).to be_able_to(:delete, Review)
       expected to be able to delete Review
     # ./spec/models/review_spec.rb:11:in `block (2 levels) in <top (required)>'

请帮助检查管理员用户的权限删除审核

通过快速审查,您对角色 ID 的假设似乎不正确。

但实际上,我认为,你做错了。

如果角色只是名称,并且您在代码中明确使用了这些名称,那么创建角色的原因是什么 table?

我建议使用角色作为字符串值:"admin""manager" 等。使用此设置,您无需猜测角色 ID 是什么,我希望它对您的测试有所帮助也是(假设你没有其他错误)。