В моей тестовой среде Cancan не строит свои правила.
способность. Rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.is_admin?
can :manage, :all
end
....
end
end
Когда я запускаю консоль разработки и выполняю следующие действия
u = User.where(role: "admin").first
u.ability.can?(:read, Order) #true
a = Ability.new(u)
a.instance_values["rules"] #gives [0] #<CanCan::Rule:0x000055f2637ece48 @match_all=false, @base_behavior=true, @actions=[:read], @subjects=[Order(id: integer, ....
показывает, что все работает нормально.Правила установлены.При этом в rails c test
a.instance_values["rules"]
пусто
u = User.where(role: "admin").first
u.ability.can?(:read, Order) #false
a = Ability.new(u)
a.instance_values["rules"] #gives []
В результате тест
RSpec.describe Ability do
describe 'User' do
describe "abilities" do
context "when is an Admin" do
subject(:admin){ AdminAbility.new(create(:admin_user)) }
it do
puts admin.can? :read, Order #false
puts admin.ability.can? :read, Order #false
puts admin.instance_values["rules"] # nil ?
expect(admin).to be_able_to(:read, Order)
end
it {expect(admin).to be_able_to(:read, User) }
end
end
end
end
неудивительно проходит с
** Failure/Error: it {expect(admim).to be_able_to(:read, Order)}
expected to be able to :read Order(...)**
Во времяпри тестовом запуске ключ rules
отсутствует (ноль) в хэше instance_values
.Там правильно генерируются для среды разработки (и производства).(Я протестировал FactorySetup для ролей и Adminuser, это не проблема)
Настройка: Rails: 3.2.22.2 Rspec: 3.8 CanCan: 1.6.10