RSpec 和 Cancancan:所有阴性测试均失败
RSpec and Cancancan: all negative tests failing
谁能帮我理解为什么只有我的阴性(即 should_not
)测试会失败?我所有的 should
测试都通过了,所以这让我觉得我有一些配置错误,虽然我不知道是什么。
ability.rb
# encoding: utf-8
#
class Ability
include CanCan::Ability
def initialize(user)
@user = user || User.new
if @user.administrator?
administrator_abilities
elsif @user.client?
client_abilities
elsif @user.guest?
guest_abilities
end
can :read, :share
end
private
def administrator_abilities
can :manage, :all
can [:index, :filter, :new, :create], :administration
end
def client_abilities
cannot :manage, administrator_resources
can :manage, [:account, :provider_auth, :user_auth]
can :read, [Component, Cover, Introduction, Template]
can :manage, client_made_resources, user_id: @user.id
end
def guest_abilities
cannot :manage, client_made_resources
cannot :manage, administrator_resources
can :create, Expression
end
def client_made_resources
[Authorisation, Document, Component,
CustomArticle, EditedArticle, Invoice, Order, Photo]
end
def administrator_resources
[Brand, Chart, Component, Cover, Expression, Introduction, Mode,
Preference, Price, Template, User, UserNote]
end
end
user_spec.rb
# encoding: utf-8
#
require 'spec_helper'
require 'cancan/matchers'
def client_made_resources
[Authorisation, Document, Component, CustomArticle, EditedArticle, Invoice,
Order, Photo]
end
def administrator_resources
[Brand, Chart, Component, Cover, Expression, Introduction, Mode, Preference,
Price, Template, User, UserNote]
end
RSpec.describe Ability do
let(:user) { create(:user, state: 'guest') }
subject { Ability.new(user) }
context 'guest' do
client_made_resources.each do |r|
it "should not be able to manage client's #{r}" do
expect(subject).to_not be_able_to(:manage, r.new)
end
end
每个阴性测试都有这样的结果:
rspec ./spec/models/user_spec.rb:69 # Ability guest should not be able to manage client's Document
感谢您的帮助。
我不知道为什么,但我重构了我的测试,它们现在可以按预期工作。也许这会对某人有所帮助。
RSpec.describe User do
describe 'Abilities' do
context 'guest' do
let(:user) { create(:user, state: 'guest') }
(client_made_resources + administrator_resources).each do |r|
it "cannot manage #{r}" do
ability = Ability.new(user)
assert ability.cannot?(:manage, r.new)
end
end
it 'can read shares' do
ability = Ability.new(user)
assert ability.can?(:read, :share)
end
...
谁能帮我理解为什么只有我的阴性(即 should_not
)测试会失败?我所有的 should
测试都通过了,所以这让我觉得我有一些配置错误,虽然我不知道是什么。
ability.rb
# encoding: utf-8
#
class Ability
include CanCan::Ability
def initialize(user)
@user = user || User.new
if @user.administrator?
administrator_abilities
elsif @user.client?
client_abilities
elsif @user.guest?
guest_abilities
end
can :read, :share
end
private
def administrator_abilities
can :manage, :all
can [:index, :filter, :new, :create], :administration
end
def client_abilities
cannot :manage, administrator_resources
can :manage, [:account, :provider_auth, :user_auth]
can :read, [Component, Cover, Introduction, Template]
can :manage, client_made_resources, user_id: @user.id
end
def guest_abilities
cannot :manage, client_made_resources
cannot :manage, administrator_resources
can :create, Expression
end
def client_made_resources
[Authorisation, Document, Component,
CustomArticle, EditedArticle, Invoice, Order, Photo]
end
def administrator_resources
[Brand, Chart, Component, Cover, Expression, Introduction, Mode,
Preference, Price, Template, User, UserNote]
end
end
user_spec.rb
# encoding: utf-8
#
require 'spec_helper'
require 'cancan/matchers'
def client_made_resources
[Authorisation, Document, Component, CustomArticle, EditedArticle, Invoice,
Order, Photo]
end
def administrator_resources
[Brand, Chart, Component, Cover, Expression, Introduction, Mode, Preference,
Price, Template, User, UserNote]
end
RSpec.describe Ability do
let(:user) { create(:user, state: 'guest') }
subject { Ability.new(user) }
context 'guest' do
client_made_resources.each do |r|
it "should not be able to manage client's #{r}" do
expect(subject).to_not be_able_to(:manage, r.new)
end
end
每个阴性测试都有这样的结果:
rspec ./spec/models/user_spec.rb:69 # Ability guest should not be able to manage client's Document
感谢您的帮助。
我不知道为什么,但我重构了我的测试,它们现在可以按预期工作。也许这会对某人有所帮助。
RSpec.describe User do
describe 'Abilities' do
context 'guest' do
let(:user) { create(:user, state: 'guest') }
(client_made_resources + administrator_resources).each do |r|
it "cannot manage #{r}" do
ability = Ability.new(user)
assert ability.cannot?(:manage, r.new)
end
end
it 'can read shares' do
ability = Ability.new(user)
assert ability.can?(:read, :share)
end
...